2017-01-13 6 views
-1

私は場所ベースのアプリを書いています。私の位置はAPI < 23で正常に動作していますが、API 23のデバイスで実行中はいつでも、「GoogleApiClientはまだ接続されていません」というエラーが表示されます。アンドロイド - ランタイムロケーション権限 - GoogleApiClientはまだ接続されていません

GoogleApiClientが接続されていることをログで確認しました。しかし、私は問題は何かを理解していない。以下は、アプリケーションがクラッシュするまでのログです。

01-13 05:20:26.200 2028-2028/com.example.raj.wallpaper1 D/numbering: startGoogleApiClient 
01-13 05:20:26.206 2028-2028/com.example.raj.wallpaper1 D/numbering: onCreate 
01-13 05:20:26.233 2028-2028/com.example.raj.wallpaper1 D/numbering: onStart 
01-13 05:20:26.233 2028-2028/com.example.raj.wallpaper1 D/numbering: onResume 

01-13 05:20:26.452 2028-2028/com.example.raj.wallpaper1 D/numbering: Location services connected. 
01-13 05:20:26.453 2028-2028/com.example.raj.wallpaper1 D/numbering: googleApiClient: [email protected] 
01-13 05:20:26.453 2028-2028/com.example.raj.wallpaper1 D/numbering: startLocationUpdates() 
01-13 05:20:26.453 2028-2028/com.example.raj.wallpaper1 D/numbering: checkPermission() 
01-13 05:20:26.453 2028-2028/com.example.raj.wallpaper1 D/numbering: googleApiClient: [email protected] 
01-13 05:20:26.453 2028-2028/com.example.raj.wallpaper1 D/numbering: askPermission() 
01-13 05:20:26.553 2028-2028/com.example.raj.wallpaper1 D/numbering: onResume 
01-13 05:20:47.053 2028-2028/com.example.raj.wallpaper1 D/numbering: onRequestPermissionsResult() 
01-13 05:20:47.058 2028-2028/com.example.raj.wallpaper1 D/numbering: startLocationUpdates() 
01-13 05:20:47.058 2028-2028/com.example.raj.wallpaper1 D/numbering: checkPermission() 
01-13 05:20:47.059 2028-2028/com.example.raj.wallpaper1 D/numbering: googleApiClient: [email protected] 
01-13 05:20:47.059 2028-2028/com.example.raj.wallpaper1 D/numbering: startLocationServices 

私のエラーログ:

Process: com.example.raj.wallpaper1, PID: 2028 
                     java.lang.RuntimeException: Failure delivering result ResultInfo{[email protected]:requestPermissions:, request=940, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.example.raj.wallpaper1/com.example.raj.wallpaper1.CuisinesList}: java.lang.IllegalStateException: GoogleApiClient is not connected yet. 
                      at android.app.ActivityThread.deliverResults(ActivityThread.java:3720) 
                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3763) 
                      at android.app.ActivityThread.-wrap16(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5443) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
                     Caused by: java.lang.IllegalStateException: GoogleApiClient is not connected yet. 
                      at com.google.android.gms.internal.zzaak.zzb(Unknown Source) 
                      at com.google.android.gms.internal.zzaan.zzb(Unknown Source) 
                      at com.google.android.gms.internal.zzaal.zzb(Unknown Source) 
                      at com.google.android.gms.internal.zzarl.requestLocationUpdates(Unknown Source) 
                      at com.example.raj.wallpaper1.CuisinesList.startLocationUpdates(CuisinesList.java:384) 
                      at com.example.raj.wallpaper1.CuisinesList.onRequestPermissionsResult(CuisinesList.java:419) 
                      at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6567) 
                      at android.app.Activity.dispatchActivityResult(Activity.java:6446) 
                      at android.app.ActivityThread.deliverResults(ActivityThread.java:3716) 
                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3763) 
                      at android.app.ActivityThread.-wrap16(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5443) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

そして、ここでは、私が実行しようとしています私のコードです。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_cuisines_list); 

    startGoogleApiClient(); 
latitude = (TextView) findViewById(R.id.latitude); 
    longitude = (TextView) findViewById((R.id.longitude)); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    Log.d("numbering", "onStart"); 
    googleApiClient.connect(); 
} 

@Override 
protected void onResume() { 
    Log.d("numbering", "onResume"); 
    super.onResume(); 

} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if (googleApiClient.isConnected()) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this); 
     googleApiClient.disconnect(); 
    }; 
} 

public void startGoogleApiClient() 
{ 
    Log.d("numbering", "startGoogleApiClient"); 
    googleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 


} 

public void startLocationServices() 
{ 
    Log.d("numbering", "startLocationServices"); 
    locationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setInterval(10 * 1000) ;  // 10 seconds, in milliseconds 

} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 

    Log.d("numbering", "Location services connected."); 
    Log.d("numbering", "googleApiClient: " + googleApiClient.toString()); 
    startLocationUpdates(); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    if (connectionResult.hasResolution() && this instanceof Activity) { 
     try { 
      Activity activity = (Activity) this; 
      // Start an Activity that tries to resolve the error 
      connectionResult.startResolutionForResult(activity, 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. 
     */ 
     Log.d("numbering", "Location services connection failed with code " + connectionResult.getErrorCode()); 
    } 

} 

@Override 
public void onLocationChanged(Location location) { 
    Log.d("numbering", "onLocationChanged()"); 
    if(googleApiClient.isConnected()) { 
     latitude.setText(String.valueOf(location.getLatitude())); 
     longitude.setText(String.valueOf(location.getLongitude())); 
    } 
} 

public void startLocationUpdates() { 
    Log.d("numbering", "startLocationUpdates()"); 

    if (checkPermission()) { 
     Log.d("numbering", "googleApiClient: " + googleApiClient.toString()); 
     startLocationServices(); 
     LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this); 
    } 
    else 
    { 
     Log.d("numbering", "googleApiClient: " + googleApiClient.toString()); 
     askPermission(); 
    } 

} 

private boolean checkPermission() { 
    Log.d("numbering", "checkPermission()"); 
    // Ask for permission if it wasn't granted yet 
    return (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED); 
} 

private void askPermission() { 
    Log.d("numbering", "askPermission()"); 
    ActivityCompat.requestPermissions(
      this, 
      new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, 
      REQ_PERMISSION 
    ); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    Log.d("numbering", "onRequestPermissionsResult()"); 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode) { 
     case REQ_PERMISSION: { 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
       // Permission granted 
       startLocationUpdates(); 

      } else { 
       // Permission denied 
       permissionsDenied(); 
      } 
      break; 
     } 
    } 
} 

private void permissionsDenied() { 
    Log.d("numbering", "permissionsDenied()"); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) { 
      showMessageOKCancel("You need to allow locationForService permissions to run the application ", 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
           requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
             REQ_PERMISSION); 
          } 
         } 
        }); 
      Log.w("numbering", "permissionsDenied()"); 
     } 
     return; 
    } 
} 


private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) { 
    new AlertDialog.Builder(this) 
      .setMessage(message) 
      .setPositiveButton("OK", okListener) 
      .setNegativeButton("Cancel", null) 
      .create() 
      .show(); 
} 

私は考えることのできるすべての解決策を試しました。私が逃していることを教えてください。

答えて

0

この問題はonRequestPermissionsResultメソッドにあります。

必要な権限を付与したら、startLocationUpdates()というメソッドが呼び出され、GoogleApiClientが正しく接続できるようになる前に呼び出されます。 GoogleApiClientが正しく初期化され、接続されていることを あなたは確かにonConnect()コールバックメソッドでstartLocationUpdates()を置くべき

これはAPIあなたが変わっただけで、このAPIから始まるこのメソッドを呼び出して終了するからだと23から始まるだけ起こっている理由ユーザーにいくつかの許可が要求されます。

+0

'startLocationUpdates()'はすでに 'onConnected()'メソッドにあります。許可を取得した後、GoogleApiClientを接続してから最初から起動し、その後に 'onConnected()'の後に 'startLocationUpdates()'に移動する必要があるということを意味しましたか? –

+0

ご意見ありがとうございます。 GoogleApiClientのアクセス権が取得された後に接続されていなかったことを理解するのに役立ちました。クラッシュの主な理由は 'onPause()'メソッドでした。私はそれを削除し、同じコードを 'onStop()'で使用しました。今働いている。迅速なお返事をありがとう。感謝します。 –

+0

あなたが投稿したlogcatに基づいて、エラーは私が言及した行にあった。 'onPause()'はクラッシュの原因になっていました。なぜなら、クライアントがクライアントを切断し、あなたが正しい権限でアクティビティに戻ったときにGoogleApiClientが接続されていないからです。あなたが問題を見つけるのを助けたら答えを受け入れることができます;) – MatPag

関連する問題