Search code examples
androidandroid-activityandroid-permissionsandroid-6.0-marshmallow

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. The usage of PackageManager.getPackageInfo() also seems correct, since if I isolate it, it works as expected.

Also, Manifest.permission.WRITE_EXTERNAL_STORAGE is defined in the Manifest, as it is expected.

<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. So if I write this in my 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.-


Solution

  • Just have to change value of requestCode on something positive.

    ActivityCompat.requestPermissions calls startActivityForResult somewhere deep inside and uses your 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. For example:

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