java - Android:为 requestcode 值选择什么?

标签 java android user-interface android-permissions android-6.0-marshmallow

ActivityCompat.requestPermissions 之类的方法要求我向它们传递一个请求代码,以便稍后在回调中进行测试(在本例中为 onRequestPermissionsResult)。我应该在请求代码中传递一些最佳实践类型的值吗?我注意到如果我只是输入一个随机的 int 我有时会收到这样的错误:

java.lang.IllegalArgumentException: Can only use lower 8 bits for requestCode



10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: FATAL EXCEPTION: main
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: Process: my package, PID: 8315
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{mypackage.myactivity}: java.lang.IllegalArgumentException: Can only use lower 8 bits for requestCode
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.ActivityThread.-wrap11(ActivityThread.java)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:  Caused by: java.lang.IllegalArgumentException: Can only use lower 8 bits for requestCode
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.support.v4.app.FragmentActivity.validateRequestPermissionsRequestCode(FragmentActivity.java:799)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompat23.java:29)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:316)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at mypackage.myactivity.checkReadPhoneState(PermissionsGatewayActivity.java:48)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at mypackage.myactivity.onCreate(PermissionsGatewayActivity.java:36)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:6237)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.ActivityThread.-wrap11(ActivityThread.java) 
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148) 
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417) 
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

最佳答案

记录调查结果以供将来引用:

以下是android.support.v4.app.FragmentActivity

的代码
 /**
 * Modifies the standard behavior to allow results to be delivered to fragments.
 * This imposes a restriction that requestCode be <= 0xffff.
 */
@Override
public void startActivityForResult(Intent intent, int requestCode) {
    if (requestCode != -1 && (requestCode&0xffff0000) != 0) {
        throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
    }
    super.startActivityForResult(intent, requestCode);
}


@Override
public final void validateRequestPermissionsRequestCode(int requestCode) {
    // We use 16 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.
    if (!mRequestedPermissionsFromFragment
            && requestCode != -1 && (requestCode & 0xffff0000) != 0) {
        throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
    }
}


范围
FragmentActivity中的startActivityForResult()要求requestCode为16位,表示范围为0到65535

另外,FragmentActivity 中的 validateRequestPermissionsRequestCode 要求 requestCode 为 16 位,即范围为 0 到 65535

关于java - Android:为 requestcode 值选择什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33331073/

相关文章:

java - 错误消息 "unreported exception java.io.IOException; must be caught or declared to be thrown"

android - 如何在 Android 上通过 XmlPullParser 和 LayoutInflater 使用外部 xml?

c++ - (WIN32 API) 编辑控件样式不适用于 CreateWindowEx 中的 RichEdit

android - 在 Android 测试中,如何检查是否显示了 View ?

android - 如何创建已弃用版本的 Android 虚拟设备

c# - Unity3D : Blur the background of a UI canvas

matlab - MATLAB 中的两个等待栏

java - 文本解析: Distinguish between "dictionary words" and names

java - 为什么在热切初始化中,在类加载时创建的单例类的实例可能会被认为是一个缺点?

java - 升级已发布的 Android App 的 minSdk