简体   繁体   English

requestPermissions NameNotFoundException android M

[英]requestPermissions NameNotFoundException android M

I have the following code: 我有以下代码:

public static void requestPermissions(final Activity activity){

    System.out.println("Permission 0 : " + activity.getPackageName());

    int permission = activity.getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, activity.getPackageName());

    if(permission != PackageManager.PERMISSION_GRANTED){
        PackageManager pm = activity.getPackageManager();

        try {
            PackageInfo pi = pm.getPackageInfo(activity.getPackageName(), PackageManager.GET_ACTIVITIES);

            System.out.println("Permission package info : " + pi);
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("Permission 1 : " + activity);
        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0xFFEEDDCC);
    }
}

No matter how I try it, I always get the following result: 无论我如何尝试,我总能得到以下结果:

10-19 17:35:31.642: I/System.out(27952): Permission 0 : com.example.testappandroid
10-19 17:35:31.643: I/System.out(27952): Permission package info : PackageInfo{7b81ba7 com.example.testappandroid}
10-19 17:35:31.643: I/System.out(27952): Permission 1 : com.example.testappandroid.MainActivity@c40298e
10-19 17:35:31.644: I/ActivityManager(862): START u0 {act=android.content.pm.action.REQUEST_PERMISSIONS pkg=com.google.android.packageinstaller cmp=com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity (has extras)} from uid 10109 on display 0
10-19 17:35:31.668: I/GrantPermissionsActivity(4527): No package: null
10-19 17:35:31.668: I/GrantPermissionsActivity(4527): android.content.pm.PackageManager$NameNotFoundException
10-19 17:35:31.668: I/GrantPermissionsActivity(4527):   at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:137)
10-19 17:35:31.668: I/GrantPermissionsActivity(4527):   at com.android.packageinstaller.permission.ui.GrantPermissionsActivity.getCallingPackageInfo(GrantPermissionsActivity.java:312)
10-19 17:35:31.668: I/GrantPermissionsActivity(4527):   at com.android.packageinstaller.permission.ui.GrantPermissionsActivity.onCreate(GrantPermissionsActivity.java:94)

This is probably a very straightforward question. 这可能是一个非常直截了当的问题。 The activity being passed to the function requestPermissions is the main activity, as you can see in the logs from the LogCat. 传递给函数requestPermissions的活动是主要活动,您可以在LogCat的日志中看到。 The usage of PackageManager.getPackageInfo() also seems correct, since if I isolate it, it works as expected. PackageManager.getPackageInfo()的用法似乎也是正确的,因为如果我隔离它,它会按预期工作。

Also, Manifest.permission.WRITE_EXTERNAL_STORAGE is defined in the Manifest, as it is expected. 此外,Manifest.permission.WRITE_EXTERNAL_STORAGE在Manifest中定义,正如预期的那样。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

EDIT 编辑

An important fact is that my static function requestPermissions(Activity) is defined in an external library, called for instance utils.jar. 一个重要的事实是我的静态函数requestPermissions(Activity)是在外部库中定义的,例如utils.jar。 So if I write this in my MainActivity.java: 所以如果我在MainActivity.java中写这个:

protected void onStart(){
    super.onStart();
    final Activity act = this;
    Utils.requestPermissions(act); // in utils.jar
}

it will fail. 它会失败。 If I write this instead: 如果我写这个:

protected void onStart(){
    super.onStart();
    final Activity act = this;
    ActivityCompat.requestPermissions(act, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}

It will ask for the permissions as expected. 它会按预期要求权限。

End of EDIT 编辑结束

Has anyone experienced this before and can shed some light? 以前有没有人经历过这种情况并且可以解决一些问 Thank you in advance.- 先感谢您。-

Just have to change value of requestCode on something positive. 只需要在正面的东西上改变requestCode的值。

ActivityCompat.requestPermissions calls startActivityForResult somewhere deep inside and uses your requestCode. ActivityCompat.requestPermissions在内部的某个地方调用startActivityForResult并使用您的requestCode。 And if it is negative will be thrown exception same as you have: 如果它是否定的,则会抛出与您相同的异常:

I/GrantPermissionsActivity: No package: null
                            android.content.pm.PackageManager$NameNotFoundException

Just change requestCode and it will be work as in an application so in a library. 只需更改requestCode,它就像在应用程序中一样工作,因此在库中。 For example: 例如:

ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 101);

I think the accepted answer may not be correct because I have used positive request key but still still getting this exception. 我认为接受的答案可能不正确,因为我使用了正请求密钥,但仍然得到此异常。 The reason why I was getting this exception is because the activity reference that I was passing to requestPermission method is null ie, the activity has actually finished before I was requesting the permission and hence I was getting that exception. 我之所以得到这个异常,是因为我传递给requestPermission方法的活动引用是null,即在我请求权限之前,活动实际上已经完成,因此我得到了这个异常。

So make sure that the activity/fragment instance that you are passing to requestPermission is not null. 因此,请确保传递给requestPermission的活动/片段实例不为null。

Hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM