我在更高版本的 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;
}
}
我在更高版本的 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 asdenied
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;
}
}