2016-06-22 16 views
20

tôi nhận được một kỳ lạ nằm ngoài giới hạn ngoại lệ trong Cửa hàng Play giao diện điều khiển liên quan đến android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallbackArrayIndexOutOfBoundsException Strange trong android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback

java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 
    at com.example.MyFragmentActivity.onRequestPermissionsResult(MyFragmentActivity.java:2068) 
    at android.app.Activity.requestPermissions(Activity.java:4163) 
    at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompat23.java:32) 
    at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:316) 
    at com.example.MyFragmentActivity.onConnected(MyFragmentActivity.java:2048) 
    at com.google.android.gms.common.internal.zzk.zzk(Unknown Source) 
    at com.google.android.gms.common.api.internal.zzj.zzi(Unknown Source) 
    at com.google.android.gms.common.api.internal.zzh.zzpx(Unknown Source) 
    at com.google.android.gms.common.api.internal.zzh.onConnected(Unknown Source) 
    at com.google.android.gms.common.api.internal.zzl.onConnected(Unknown Source) 
    at com.google.android.gms.common.api.internal.zzc.onConnected(Unknown Source) 
    at com.google.android.gms.common.internal.zzj$zzg.zzqL(Unknown Source) 
    at com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source) 
    at com.google.android.gms.common.internal.zzj$zza.zzw(Unknown Source) 
    at com.google.android.gms.common.internal.zzj$zzc.zzqN(Unknown Source) 
    at com.google.android.gms.common.internal.zzj$zzb.handleMessage(Unknown Source) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7229) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

Đây là thực hiện onRequestPermissionsResult tôi

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_ASK_LOCATION_PERMISSIONS: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // Permission Granted 
       if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
       } 
       startLocationUpdates(); 
      } else { 
       // Permission Denied 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

Dòng 2068 là:

if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

Tôi tin rằng nó tuyên bố chiều dài grantResults là 0, đó là lý do tại sao java.lang.ArrayIndexOutOfBoundsException bị ném. Theo documentation

int: Kết quả cấp cho các điều khoản tương ứng là hoặc PERMISSION_GRANTED hoặc PERMISSION_DENIED. Không bao giờ rỗng.

grantResults sẽ không rỗng, nhưng không nói gì về giá trị không chứa giá trị. Hơn nữa, có vẻ như cuộc gọi lại sẽ chứa ít nhất một giá trị, hoặc là PERMISSION_GRANTED hoặc PERMISSION_DENIED. Đây có phải là lỗi hay tôi hiểu nhầm tài liệu?

Trả lời

32

Documentation about permissions nói

Nếu yêu cầu bị hủy, các mảng kết quả là rỗng.

Và nó có vẻ là tình hình của bạn, vì vậy bạn phải kiểm tra đầu tiên nếu mảng là không rỗng:

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_ASK_LOCATION_PERMISSIONS: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // Permission Granted 
       if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
       } 
       startLocationUpdates(); 
      } else { 
       // Permission Denied 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 
+1

Vâng, đó là trường hợp. Câu trả lời chính xác. – jnellen

+0

Tuyệt vời. Đúng. –

+0

Có ai biết "yêu cầu bị hủy" nghĩa là gì không? Ai đã hủy nó? Tôi không biết bất kỳ API nào để hủy yêu cầu và tôi không hiểu cách người dùng có thể hủy nó khi rõ ràng là có hoặc không có điều gì với người dùng ... – user3175580

Các vấn đề liên quan