2

我最近更新了一個應用程序到targetSdkVersion爲23,並實現了對各種權限的請求。我使用ActivityCompat.requestPermissions()最初的嘗試導致一個IllegalArgumentException從FragmentActivity的內部拋出:爲什麼ActivityCompat.requestPermissions()只接受0-255之間的整數請求代碼?

int REQUEST_CODE_A = 9001; 
ActivityCompat.requestPermissions(new String[ {Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_A); // crashes 

java.lang.IllegalArgumentException異常:可用於requestCode

,如果只使用低8位然而請求代碼在0-255之間,一切都很好,權限請求按預期工作。

int REQUEST_CODE_B = 101; 
ActivityCompat.requestPermissions(new String[ {Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_B); // works correctly 

所以問題是,有什麼理由限制在這樣的API中的整數的可能值?使用一個字節可以提供相同的信息,但是有意識的決定已經(顯然)被用來使用整數來代替。這僅僅是一個允許未來可擴展性的情況嗎?

+1

可能重複[Android:請求代碼值選擇什麼?](http://stackoverflow.com/questions/33331073/android-what-to-choose-for-requestcode-values) –

回答

5

引用the source code to FragmentActivity其中此異常似乎被拋出:

// We use 8 bits of the request code to encode the fragment id when 
    // requesting permissions from a fragment. Hence, requestPermissions() 
    // should validate the code against that but we cannot override it as 
    // we can not then call super and also the ActivityCompat would call 
    // back to this override. To handle this we use dependency inversion 
    // where we are the validator of request codes when requesting 
    // permissions in ActivityCompat. 

startActivityForResult()對請求的代碼,至少在FragmentActivity一個16位的限制。

+0

是8位在這種情況下優化16位限制?我不確定爲什麼兩個「單獨的」值將被存儲在一個變量中。 – fractalwrench

+1

@fractalwrench:「我不確定爲什麼兩個」獨立「值將被存儲在一個變量中」 - 因爲'startActivityForResult()'是IPC,就像'onActivityResult()'一樣。協議規定請求代碼是一個單一的值,由'startActivityForResult()'提供,並在'onActivityResult()'中返回。一個更靈活的方法會讓我們傳遞一個任意的Parcelable,並且得到Parcelable(或者技術上來說是一個副本),但是不管什麼原因,它們都沒有在十年前那樣實現。 – CommonsWare

相關問題