【Android Developers Training】103.現在の場所を検索する

21960 ワード

この文章はGoogleの公式Android Developers Trainingの文書から訳して、翻訳者の技術は普通で、Androidが好きなため翻訳の考えを生んで、全く個人の興味の趣味です.
リンク:http://developer.android.com/training/location/retrieve-current.html
場所サービスは自動的にユーザーの現在の場所を維持します.だから、あなたのアプリケーションがすることは必要な時にそれを取得することです.場所の精度は、あなたが申請した場所照会権限と、現在のデバイスでアクティブな位置センサに基づいています.
場所サービスは、クライアントを特定することによって、現在の位置をアプリケーションに送信します.すべての場所情報の要求はこのクライアントを通じて行われます.
ノート:
この授業を始める前に、あなたの開発環境とテスト設備が正しく配置されていることを確認してください.LocationCientを読んで、より多くの情報を得ることができる.
一)アプリケーションの権限を指定する
位置サービスを利用するアプリケーションは、位置指定権限を要求しなければならない.Androidには2つの位置決め権限があります.セットアップ(粗位置決め)とACCESS_COARSE_LOCATION(精密位置決め).あなたが選択した権限が位置決めの精度を決定しました.粗位置決めだけを要求すれば、位置サービスの範囲の位置情報は大体1つの都市街区に正確に届きます.
要求がACCESS_FINE_LOCATIONであれば、ACCESS_FINE_LOCATIONの権限も含まれている.
例えば、ACCESS_COARSE_LOCATIONを追加し、ACCESS_COARSE_LOCATION要素のサブ要素として以下のコードを使用する.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
二).Google Playサービスをチェックする
位置サービスはGoogle PlayサービスAPKの一部です.ユーザーのデバイスの状態が予想できないので、あなたはずっとあなたがポジショニングサービスに接続しようとする前に、APKがインストールされているかどうかを確認するべきです.APKがインストールされているかどうかを確認するには、<manifest>を呼び出し、整形結果コードを返すことができ、その意味は、GooglePlayServices Util.isGooglePlayServices Available()を参照することができる.エラーが発生した場合は、Connection Resoultを呼び出して、ローカルのダイアログを取得し、ユーザを正しい行動に導くことができます.その後、このダイアログをGooglePlayServices Util.getErrror Dialog()に表示します.このダイアログでは、ユーザーが現在の問題を解決することができます.Google Playサービスは、結果をあなたのactivityに送ります.この結果を処理するには、Dialog Fragment方法を上書きする必要がある.
あなたは常にあなたのコードの複数の場所でGoogle Playサービスをチェックする必要があるので、チェックを行います.その後は接続試行のたびにチェックします.以下のコードセグメントにはGoogle Playサービスをチェックするために必要なコードが含まれています.
public class MainActivity extends FragmentActivity {

    ...

    // Global constants

    /*

     * Define a request code to send to Google Play services

     * This code is returned in Activity.onActivityResult

     */

    private final static int

            CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;

    ...

    // Define a DialogFragment that displays the error dialog

    public static class ErrorDialogFragment extends DialogFragment {

        // Global field to contain the error dialog

        private Dialog mDialog;

        // Default constructor. Sets the dialog field to null

        public ErrorDialogFragment() {

            super();

            mDialog = null;

        }

        // Set the dialog to display

        public void setDialog(Dialog dialog) {

            mDialog = dialog;

        }

        // Return a Dialog to the DialogFragment.

        @Override

        public Dialog onCreateDialog(Bundle savedInstanceState) {

            return mDialog;

        }

    }

    ...

    /*

     * Handle results returned to the FragmentActivity

     * by Google Play services

     */

    @Override

    protected void onActivityResult(

            int requestCode, int resultCode, Intent data) {

        // Decide what to do based on the original request code

        switch (requestCode) {

            ...

            case CONNECTION_FAILURE_RESOLUTION_REQUEST :

            /*

             * If the result code is Activity.RESULT_OK, try

             * to connect again

             */

                switch (resultCode) {

                    case Activity.RESULT_OK :

                    /*

                     * Try the request again

                     */

                    ...

                    break;

                }

            ...

        }

     }

    ...

    private boolean servicesConnected() {

        // Check that Google Play services is available

        int resultCode =

                GooglePlayServicesUtil.

                        isGooglePlayServicesAvailable(this);

        // If Google Play services is available

        if (ConnectionResult.SUCCESS == resultCode) {

            // In debug mode, log the status

            Log.d("Location Updates",

                    "Google Play services is available.");

            // Continue

            return true;

        // Google Play services was not available for some reason

        } else {

            // Get the error code

            int errorCode = connectionResult.getErrorCode();

            // Get the error dialog from Google Play services

            Dialog errorDialog = GooglePlayServicesUtil.getErrorDialog(

                    errorCode,

                    this,

                    CONNECTION_FAILURE_RESOLUTION_REQUEST);



            // If Google Play services can provide an error dialog

            if (errorDialog != null) {

                // Create a new DialogFragment for the error dialog

                ErrorDialogFragment errorFragment =

                        new ErrorDialogFragment();

                // Set the dialog in the DialogFragment

                errorFragment.setDialog(errorDialog);

                // Show the error dialog in the DialogFragment

                errorFragment.show(getSupportFragmentManager(),

                        "Location Updates");

            }

        }

    }

    ...

}
次の章のコードセグメントでは、この方法を呼び出してGoogle Playサービスを取得できるかどうかを検証します.
三)位置サービスのコールバック関数を定義する
現在の場所を取得するには、位置特定サービスに接続した場所クライアントを作成し、onActivityResoult()方法を起動する.返した値は最新の地理的位置に最適で、あなたのアプリケーションによって要求された権限と現在のデバイスでアクティブにされている位置センサに基づいています.
クライアントの位置を決める前に、位置サービスのインターフェースを実現して、あなたのアプリケーションと対話します.
get LastLocation()
位置決め接続上または接続されていない場合、サービス呼び出しの方法を指定します.
Connection Callbacks
位置決めクライアントに接続しようとした場合、エラーが発生した場合、サービスの呼び出し方法を指定します.この方法は、以前に定義されたshowError Dialog法を用いて、Google Playサービスを使ってこの問題を解決しようとするエラーダイアログを表示する.
以下のサンプルコードは、インターフェースの指定と定義に関する関数を示す.
public class MainActivity extends FragmentActivity implements

        GooglePlayServicesClient.ConnectionCallbacks,

        GooglePlayServicesClient.OnConnectionFailedListener {

    ...

    /*

     * Called by Location Services when the request to connect the

     * client finishes successfully. At this point, you can

     * request the current location or start periodic updates

     */

    @Override

    public void onConnected(Bundle dataBundle) {

        // Display the connection status

        Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();



    }

    ...

    /*

     * Called by Location Services if the connection to the

     * location client drops because of an error.

     */

    @Override

    public void onDisconnected() {

        // Display the connection status

        Toast.makeText(this, "Disconnected. Please re-connect.",

                Toast.LENGTH_SHORT).show();

    }

    ...

    /*

     * Called by Location Services if the attempt to

     * Location Services fails.

     */

    @Override

    public void onConnectionFailed(ConnectionResult connectionResult) {

        /*

         * Google Play services can resolve some errors it detects.

         * If the error has a resolution, try sending an Intent to

         * start a Google Play services activity that can resolve

         * error.

         */

        if (connectionResult.hasResolution()) {

            try {

                // Start an Activity that tries to resolve the error

                connectionResult.startResolutionForResult(

                        this,

                        CONNECTION_FAILURE_RESOLUTION_REQUEST);

                /*

                 * Thrown if Google Play services canceled the original

                 * PendingIntent

                 */

            } catch (IntentSender.SendIntentException e) {

                // Log the error

                e.printStackTrace();

            }

        } else {

            /*

             * If no resolution is available, display a dialog to the

             * user with the error.

             */

            showErrorDialog(connectionResult.getErrorCode());

        }

    }

    ...

}
四)位置決めクライアントを接続する
ここでは、コールバック関数は位置につきました.クライアントを作成し、位置決めサービスに接続します.
OnConnection Failed Listener方法で位置クライアントを作成してからonCreate()方法で接続するべきです.このようにポジショニングサービスはあなたのアプリケーションが完全に見える時に現在のポジショニング情報を維持することができます.onStart()方法では、アプリケーションが見えない場合、位置サービスは更新場所を停止する.このような接続は電気量を節約することができます.
ノート:
ポジショニングクライアントがポジショニングサービスに接続された後だけ、現在の場所が維持されます.位置決めサービスに他のアプリケーションが接続されていないと仮定して、クライアントがオフになったら、しばらくしたらonStop()を呼び出して、結果は期限が切れてしまうかもしれません.
たとえば:
public class MainActivity extends FragmentActivity implements

        GooglePlayServicesClient.ConnectionCallbacks,

        GooglePlayServicesClient.OnConnectionFailedListener {

    ...

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        ...

        /*

         * Create a new location client, using the enclosing class to

         * handle callbacks.

         */

        mLocationClient = new LocationClient(this, this, this);

        ...

    }

    ...

    /*

     * Called when the Activity becomes visible.

     */

    @Override

    protected void onStart() {

        super.onStart();

        // Connect the client.

        mLocationClient.connect();

    }

    ...

    /*

     * Called when the Activity is no longer visible.

     */

    @Override

    protected void onStop() {

        // Disconnecting the client invalidates it.

        mLocationClient.disconnect();

        super.onStop();

    }

    ...

}
五)現在地を取得する
現在の場所を取得するには、例えばget LastLocation()を呼び出す.
public class MainActivity extends FragmentActivity implements

        GooglePlayServicesClient.ConnectionCallbacks,

        GooglePlayServicesClient.OnConnectionFailedListener {

    ...

    // Global variable to hold the current location

    Location mCurrentLocation;

    ...

    mCurrentLocation = mLocationClient.getLastLocation();

    ...

}
次の授業では、定位サービスから定期的に場所更新を受ける方法を示します.