我在更高版本的 android 中遇到权限检查问题

I have issue with permission check in higher versions of android

我在更高版本的 android.I 中遇到权限检查问题,正在检查所有权限,但应用程序在 6.0 上仍然崩溃。

这是我的 java 代码:

  if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M  &&
               checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
    {
        requestPermissions(new String[]{android.Manifest.permission.GET_ACCOUNTS}, 0);
        requestPermissions(new String[]{android.Manifest.permission.INTERNET}, 0);
        requestPermissions(new String[]{android.Manifest.permission.ACCESS_NETWORK_STATE}, 0);
        requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
        requestPermissions(new String[]{android.Manifest.permission.CALL_PHONE}, 0);
        requestPermissions(new String[]{android.Manifest.permission.WAKE_LOCK}, 0);
        requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, 0);
        requestPermissions(new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 0);
    }
    else
    {
        jump_to_nextActivity();
    }


}

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
    //super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    for (int i = 0, len = permissions.length; i < len; i++)
    {
        String permission = permissions[i];
        if (grantResults[i] == PackageManager.PERMISSION_DENIED)
        {
            flag = false;
        }
    }
    if(flag==true)
    {
        Intent i = new Intent(Splash.this,Home.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        //i.putExtra("EXIT", true);
        startActivity(i);
        Splash.this.finish();
    }
}

这是我的 Android 清单:

     <permission
    android:name="android.OMMSoftware.Navsahydri.permission.MAPS_RECEIVE"
    android:protectionLevel="signature"/>
<uses-permission android:name="android.OMMSoftware.Navsahydri.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="fractal5.mythirdapp.permission.MAPS_RECEIVE" />

应用程序在较低版本上 运行 但在 6.0 上测试时它崩溃了,请帮助。

这是我的 Logcat:

致命异常:主要 进程:android.inclusiveit.growbizz,PID:16919 java.lang.RuntimeException: 传递结果失败 ResultInfo{who=@android:requestPermissions:, request=0, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (有额外) }} activity {android.inclusiveit.growbizz/android.OMMSoftware.Navsahydri.Splash}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'boolean java.lang.Boolean.booleanValue()' 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3949) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3992) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1543) 在 android.os.Handler.dispatchMessage(Handler.java:111) 在 android.os.Looper.loop(Looper.java:207) 在 android.app.ActivityThread.main(ActivityThread.java:5776) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 由以下原因引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'boolean java.lang.Boolean.booleanValue()' 在 android.OMMSoftware.Navsahydri.Splash.onRequestPermissionsResult(Splash.java:54) 在 android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6969) 在 android.app.Activity.dispatchActivityResult(Activity.java:6848) 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3945) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3992) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1543) 在 android.os.Handler.dispatchMessage(Handler.java:111) 在 android.os.Looper.loop(Looper.java:207) 在 android.app.ActivityThread.main(ActivityThread.java:5776) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

您需要在Manifest中单独提及被Android文档分类为"Dangerous"的权限。这是一个例子:

<permission
    android:name="android.permission.ACCESS_COARSE_LOCATION"
    android:protectionLevel="dangerous" />

您可以看到完整的正常和危险权限列表here

这里你只检查READ_EXTERNAL_STORAGE权限,请检查你在清单中声明的​​所有危险权限。像 ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION

可能的错误原因是您没有在 manifest.xml 文件中声明所有必需的权限。

Note that if you are requesting permission that is not declared into manifest.xml, it will always returned as denied by the system iteself.

还有一点,为什么要一次检查所有权限? 相反,您可以做的是在运行时检查权限,而您的函数需要系统授予的权限。

此外,没有必要像你那样设置 android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M 条件 -
ContextCompat.checkSelfPermission() 方法 returns 即使在较低的 api 版本中也会相应地产生结果。

错误在于您的清单权限。

<uses-permission android:name="android.OMMSoftware.Navsahydri.permission.MAPS_RECEIVE"/>
<uses-permission android:name="fractal5.mythirdapp.permission.MAPS_RECEIVE" />

由于 Android 无法识别这些权限,只需删除它们即可。

当 Android 发布 Marshmallow 版本时,它引入了运行时权限作为其功能之一。该功能包括在访问位置、相机、图库、联系人等时征得用户的许可。因此,每次用户尝试访问上述任何内容时,让我们考虑一下本例中的 Camera,它会请求许可。弹出窗口会显示需要访问您的相机的权限,无论是允许还是拒绝。如果您拒绝并选中复选框不再询问,则用户将无法在整个应用程序中访问相机。用户需要为弹出窗口重新安装。用户可以通过两种方式授予权限:通过设置或通过弹出窗口。为了使它更加用户友好,我们在我们的应用程序中插入了弹出窗口

例如,您正在检查 Location 的权限,请在 onMapReady 方法中使用此代码

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            if (MapLayoutActivity.this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
            {
                MapLayoutActivity.this.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_STORAGE);
                return;
            }

            if (MapLayoutActivity.this.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
            {
                MapLayoutActivity.this.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_STORAGE);
                return;
            }
        }