【问题标题】:I have issue with permission check in higher versions of android我在更高版本的 android 中遇到权限检查问题
【发布时间】:2017-03-22 05:49:46
【问题描述】:

我在更高版本的 android 中遇到权限检查问题。我正在检查所有权限,但在 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 (has extras) }} 失败活动{android.inclusiveit.growbizz/android.OMMSoftware.Navsahydro.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.Navsahydra.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)

【问题讨论】:

  • 它在控制台中给出了什么错误?使用 try catch 查找错误。
  • 为什么没有人再发布他们的堆栈跟踪了?我们应该猜测错误吗?
  • 发布错误堆栈跟踪日志猫

标签: android android-permissions runtime-permissions


【解决方案1】:

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

请注意,如果您请求的权限未声明为 manifest.xml,系统会一直返回为denied

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

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

【讨论】:

    【解决方案2】:

    您需要在 Manifest 中单独提及被 Android 文档归类为“危险”的权限。这是一个例子:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        例如,您正在检查 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;
                    }
                }
        

        【讨论】:

          【解决方案5】:

          错误在于您的清单权限。

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

          由于 Android 无法识别这些权限,请删除它们。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多