2017-08-06 4 views
0

ユーザーがGoogleプレイサービスの更新を拒否した場合、どのように正しくアクティビティを終了しますか?私は便宜のためにmakeGooglePlayServicesAvailable()を使用していますが、私はその使用法の多くの例を見つけていません。makeGooglePlayServicesAvailableのキャンセルの処理

私はとonResume()checkGooglePlayServices()(下のコード)を使用します。

public class MainScreen extends Activity { 
    private static final String TAG = "MainScreen"; 

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

     checkGooglePlayServices(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     checkGooglePlayServices(); 
    } 

    void checkGooglePlayServices() 
    { 
     GoogleApiAvailability.getInstance() 
     .makeGooglePlayServicesAvailable(this) 
     .addOnSuccessListener(new OnSuccessListener<Void>() { 
      @Override 
      public void onSuccess(Void ignored) { 
        Log.d(TAG,"makeGooglePlayServicesAvailable().onSuccess()"); 

       // GPS available; do something useful 

      } 
     }).addOnFailureListener(this,new OnFailureListener() { 
      @Override 
      public void onFailure(@NonNull Exception e) { 

       Log.d(TAG,"makeGooglePlayServicesAvailable().onFailure()"); 
       e.printStackTrace(); 

       Toast.makeText(MainScreen.this, 
        "Google Play services upgrade required", 
        Toast.LENGTH_SHORT).show(); 

       // can't proceed without GPS; quit 

       MainScreen.this.finish(); // this causes a crash 
      } 
     }); 
    } 
} 

アプリがクラッシュfinish()が呼び出される:

com.example E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example, PID: 5336 
    java.lang.RuntimeException: Unable to destroy activity {com.example/com.example.MainScreen}: java.lang.IllegalStateException: Task is already complete 
     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4438) 
     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4456) 
     ... 
    Caused by: java.lang.IllegalStateException: Task is already complete 
     at com.google.android.gms.common.internal.zzbo.zza(Unknown Source:8) 
     at com.google.android.gms.tasks.zzn.zzDH(Unknown Source:8) 
     at com.google.android.gms.tasks.zzn.setException(Unknown Source:9) 
     at com.google.android.gms.tasks.TaskCompletionSource.setException(Unknown Source:2) 
     ... 

答えて

1

私はあなたがGPSの更新要求をキャンセルし、「戻る」を押していることを前提としています。エラーは、onDestroy()のスーパーへの呼び出しに来ています。これは、Androidが既に進展できないと予想しており、すでに終了していることを示しているようです。

とにかく、障害リスナーのコールバックで問題を閉じるための優雅な方法を判断できませんでしたが、これはやはりGoogleApiAvailabilityというやや異なるアプローチです。私はこれをテストして、それが動作するようです。

以下でごcheckGooglePlayServices()を置き換えます

private static final int GPS_REQUEST_CODE = 1; // arbitrary code 

void checkGooglePlayServices() { 
    GoogleApiAvailability api = GoogleApiAvailability.getInstance(); 
    int status = api.isGooglePlayServicesAvailable(this); 
    if (status != ConnectionResult.SUCCESS) { 
     if (api.isUserResolvableError(status)) { 
      // onActivityResult() will be called with GPS_REQUEST_CODE 
      Dialog dialog = api.getErrorDialog(this, status, GPS_REQUEST_CODE, 
        new DialogInterface.OnCancelListener() { 
         @Override 
         public void onCancel(DialogInterface dialog) { 
          // GPS update was cancelled. 
          // Do toast or dialog (probably better to do) here. 
          finish(); 
         } 
        }); 
      dialog.show(); 
     } else { 
      // unrecoverable error 
     } 
    } 
} 

このコードは、コールバックを回避したが、まだGPSが利用可能かどうかを確認することができるようになります。 Hereはドキュメントです。

Hereは、サンプルアプリケーションでは同じアプローチです。

コードを実行したい場合は、次のハックを実行できますが、クラッシュをキャプチャしてユーザーからの不快感を隠すためには、上記の方法をお勧めします。

@Override 
public void onDestroy() { 
    try { 
     super.onDestroy(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 
} 
+0

これはGPSをチェックする一般的な方法のようです。誰かが 'makeGooglePlayServicesAvailable'の使用に関する答えを持っている場合には、少し質問を残しておきます。チェックするために他に何を提案していますか?リンクしたドキュメントは、可用性をチェックすることに関するものです。 – stardt

+0

誰かを助けてくれる場合、 'E/WindowManager:android.view.WindowLeaked:Activity com.example.MainScreen has Leaked window ... 'という解決策は' onCreate'で 'checkGPS()'を実行しないことです。 [documentation](https://firebase.google.com/docs/cloud-messaging/android/client)は、「主なアクティビティのonCreate()メソッドとそのonResumeの2つの場所でこれを行うことをお勧めします() 方法。" – stardt

+0

@stardt答えを更新しました。追加事項を確認するには、GPSを更新するために必要なネットワークの可用性をチェックすることを考えていただけです。私は 'makeGooglePlayServicesAvailable'について興味があります。 GPSをチェックする作業が始まるようです。私の答えとは異なるユースケースは何ですか? – Cheticamp

関連する問題