2017-06-02 40 views
2

最近我在使用React-Native應用程序時遇到了一個非常奇怪的問題。這裏是我的environement:請求權限時引發React-Native(Android):ArrayIndexOutOfBoundsException

  • 矩形本地0.42.3
  • 三星Galaxy Note 5
  • 的Android 6.0

正如你可能知道,Android的權限模型自棉花糖改變,但一些幾天前,我得到了他的例外:

java.lang.RuntimeException: 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4156) 
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4250) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1839) 
    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:0) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
Caused by: java.lang.ArrayIndexOutOfBoundsException: 
    at com.facebook.react.modules.permissions.PermissionsModule$1.invoke(PermissionsModule.java:119) 
    at com.facebook.react.modules.permissions.PermissionsModule.onRequestPermissionsResult(PermissionsModule.java:207) 
    at com.facebook.react.ReactActivityDelegate$1.invoke(ReactActivityDelegate.java:211) 
    at com.facebook.react.ReactActivityDelegate.onResume(ReactActivityDelegate.java:131) 
    at com.facebook.react.ReactActivity.onResume(ReactActivity.java:66) 
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1286) 
    at android.app.Activity.performResume(Activity.java:6987) 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4145) 

首先,我以爲我錯過了在代碼檢查,如解釋here但這並非如此,因爲否則我會這樣,而不是消息:

java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{fac49ea 4674:com.gospacesmobile/u0a65} (pid=4674, uid=10065) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS 

我看着陣營本地的代碼,發現這樣的:

// com.facebook.react.modules.permissions.PermissionsModule.java 
int[] results = (int[]) args[0]; 
if (results[0] == PackageManager.PERMISSION_GRANTED) { // <- the exception happens when results is empty 
    promise.resolve(GRANTED); 
} else { 
    PermissionAwareActivity activity = (PermissionAwareActivity) args[1]; 
    if (activity.shouldShowRequestPermissionRationale(permission)) { 
     promise.resolve(DENIED); 
    } else { 
     promise.resolve(NEVER_ASK_AGAIN); 
    } 
} 

根據documentation的grantResults變量可能是空的,只要權限請求被取消:

@Override 
public void onRequestPermissionsResult(int requestCode, 
     String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

不幸的是,我沒有客戶端代碼(如崩潰在谷歌控制檯開發報告沒有提及它)。在任何情況下,不應該React-Native檢查是否爲空的grantResults?這是一個錯誤?如果是的話,這怎麼能被複制?我不認爲有任何辦法可以做到這一點,除非取消承諾,確保是否已啓用權限(考慮反應原生權限API是不可能的)。

任何想法都非常受歡迎。先謝謝你。

+0

我遇到過類似的問題。加載我的應用程序的開發版本時請求權限。我認爲它會在應用程序啓動時將應用程序縮小,並導致崩潰。我不確定它是否仍然是生產中的問題。 – Culzean

回答

1

所以我終於找到了問題。無論何時出現權限請求對話框,如果用戶最小化應用程序,然後通過從主菜單中單擊應用程序的圖標返回,則results爲空,從而導致應用程序崩潰。

這似乎很安靜一個簡單的問題,我決定猴子補丁React-Native以防止不穩定的升級(現在我檢查results數組是否爲空,如果是,那麼否認請求)。我仍然不知道這是一個常見問題還是來自我的應用程序。