カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

Javaアプリケーションが実行できないときの対処法

とあるPCで、Internet ExplorerでもGoogle ChromeでもJavaアプリケーションが実行できないことがありました。

これまではセキュリティレベルを中にすることで大抵は解消されていましたが、それでもエラーが発生し実行できませんでした。

実際にエラーを確認したのはJava7 update55でしたが、これはどうやらJava7 update51から発生しているらしい。

対処法1

コントロールパネルからJavaのコントロールパネルを開く。
[セキュリティ]タブの例外サイト・リストにURLを追加する。

対処法2

同じくJavaのコントロールパネルを開く。
[詳細]タブにて「次世代のJava Plug-inを有効にする(ブラウザの再起動が必要)」のチェックを外す。

セキュリティの問題上、厳しくなってきているようです。
そのため、やみくもに許可していいというわけではありません。
信頼できるサイトのみ、許可するようにしましょう。

7,250 views

WebViewを使ったハイブリッドアプリの作成 [Android]

HTML5+JavaScriptを使ってスマホアプリを開発することもできます。
ネイティブとWebアプリの機能を兼ね備えた、俗にハイブリッドアプリと呼ばれるそうです。

ここで作成するのはハイブリッドというには簡単すぎるものですが、
触りとなるものです。

まず、メインとなるアクティビティを作成します。
サンプルですので、WebViewのみ表示するものとなっています。

public class SampleActivity extends Activity {

    private final int FC = ViewGroup.LayoutParams.FILL_PARENT;
    public static WebView web;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout linearLayout = new LinearLayout(this);
        linearLayout.setOrientation(1);

        setContentView(linearLayout);

        web = new WebView(this);
        linearLayout.addView(web, new LayoutParams(FC, FC));

        // JavaScriptを有効にする
        web.getSettings().setJavaScriptEnabled(true);

        // JavaScriptにAPIを追加する
        web.addJavascriptInterface(new JavaScriptObject(this), "myapi");

        // スクロールバーを非表示にする
        web.setHorizontalScrollBarEnabled(false);
        web.setVerticalScrollBarEnabled(false);

        // フォーカスを有効にする
        web.setFocusable(true);

        // assetsディレクトリに用意したHTMLを読み込み
        web.loadUrl("file:///android_asset/sample.html");
    }

}

29行目のフォーカスを有効にするというのはデフォルトで有効になっていますが、
敢えて明示的に有効にしています。
どういった場合に無効にするのかと言いますと、全画面表示のゲームを作成する場合等です。
無効にする場合は引数をfalseとします。

web.setFocusable(false);

更にその場合はスリープモードにしないようにもしておいたほうがよいでしょう。
onCreateの最後にでも記述しておきましょう。

// スリープモードにしないようにする
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

次に、JavaScriptのAPIとなるクラスを作成します。 続きを読む…»

7,391 views

逆ジオコーディングで住所の取得

GoogleのAPIを利用して、座標から住所を取得します。
GoogleのWebサービスに依存しているので、使えない場合があるので注意しましょう。
Android 2.3(API level 9)からisPresent()で、サービスが生きてるかどうかをチェックできるようです。

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;

public class ReverseGeocode {

    public String point2address(Context context, double latitude, double longitude) throws IOException {

        String string = new String();

        Geocoder geocoder = new Geocoder(context, Locale.JAPAN);

        List<address> list_address = geocoder.getFromLocation(latitude, longitude, 2);

        if(!list_address.isEmpty()) {
            string = list_address.get(1).getAddressLine(1);
        } else {
            string = "現在地が特定できませんでした。";
        }

        return string;
    }

}

続きを読む…»

9,729 views

Android開発用IDE「Android Studio」

Googleから「Android Studio」というAndroid開発用のIDEが発表されたので早速インストールを試してみました。

Android Studioは2013年5月15日にGoogleのイベントで発表されたAndroid用のIDEです。
Eclipseの場合はADT(Android Developer Tools)プラグイン、Android SDKなどを別々にインストールしなければいけなかったのが、Android Studioの場合はAndroid SDKをインストールする必要がない。
ただし、JDKだけは必要となるのでインストールが必要です。

Android Studio 0.1.1 Build 130.687321をダウンロードしてインストール
http://developer.android.com/sdk/installing/studio.html
※現時点ではまだ早期アクセス版で、正式リリースではないようです。
setup1

setup2
続きを読む…»

4,083 views

グーグルマップに移動した軌跡を表示する [Android]

グーグルマップに現在地を表示し、移動した軌跡を線で描画してみたいと思います。
描画の度にオーバーレイを重ねていくと、当然のことながら重たくなっていくので、
表示するオーバーレイは常に1枚、ルート情報はpathRouteに記憶させるようにしました。
ルート情報が増える毎にオーバーレイを書き直しています。

まずは、LocationListenerを実装し、MapActivityクラス継承したクラスを作成します。

public class MyMap extends MapActivity implements LocationListener {

    private MapView mMapView;
    private MapController mMapController;
    private MyLocationOverlay mOverlay;
    private LocationManager mLocationManager;
    private LineOverlay lineOverlay = new LineOverlay(); //軌跡を描画するオーバーレイ

    public static List<GeoPoint> pathRoute; //ルート情報

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        mMapView = (MapView)findViewById(R.id.mapview);
        mMapView.setClickable(true);

        mMapController = mMapView.getController();
        mMapController.setZoom(16);

        //現在地を表示
        mOverlay = new MyLocationOverlay(this, mMapView);
        mOverlay.onProviderEnabled(LocationManager.GPS_PROVIDER);
        mOverlay.enableMyLocation();
        mOverlay.runOnFirstFix(new Runnable(){
            public void run(){
                GeoPoint mPoint = mOverlay.getMyLocation();
                mMapController.animateTo(mPoint);
            }
        });
        mMapView.getOverlays().add(mOverlay);

        mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    }

    @Override
    public void onResume(){
        super.onResume();

        mOverlay.enableMyLocation();

        if (mLocationManager != null) {
            mLocationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, // 精度は高いが遅い(誤差15m程度)
                //LocationManager.NETWORK_PROVIDER, // 精度は低いが速い(誤差100m程度)
                //LocationManager.PASSIVE_PROVIDER, //位置情報の修正を行わない特殊なプロバイダー(他アプリ等で測位された場合に、その位置情報を流用するらしい)
                5000, //通知する時間の間隔をミリ秒で指定します
                0, //通知する距離の間隔をメートルで指定します
                this);
        }
    }

    public void onPause(){
        super.onPause();

        mOverlay.disableMyLocation();

        if (mLocationManager != null) {
            mLocationManager.removeUpdates(this);
        }
    }

    //…以下省略
}

onLocationChangedイベントにてlineOverlayにポイントを追加します。 続きを読む…»

11,510 views