首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Marshmallow权限错误

Android Marshmallow权限错误
EN

Stack Overflow用户
提问于 2016-04-18 20:08:17
回答 3查看 835关注 0票数 1

例如,我正在向我的应用程序添加某些权限,以允许访问摄像头,一切都运行得很好。但是,当我最小化应用程序并禁用权限,然后打开应用程序时,应用程序崩溃,没有询问我重新启用权限(直到我关闭应用程序,然后打开它)。如何修复此错误,使应用程序不会崩溃并再次请求权限或安全重新启动以请求权限。

以下是我的代码

在主要活动中:

onCreate:

代码语言:javascript
复制
 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA},
                    GlobalVariables.MY_PERMISSIONS_REQUEST_CAMERA);
        }


@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode)
        {

            case GlobalVariables.MY_PERMISSIONS_REQUEST_CAMERA:
            {
                if (grantResults.length <= 0
                        || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                    globalVariables.ShowOKAlert("Error","Please Accept All Requested Permissions or the app wont function properly",this,false);
                }
                return;
            }
        }
    }

该活动实现ActivityCompat.OnRequestPermissionsResultCallback

EN

回答 3

Stack Overflow用户

发布于 2016-12-20 19:22:20

步骤1:

代码语言:javascript
复制
 String[] permissions = new String[]{ 
    Manifest.permission.INTERNET,
    Manifest.permission.READ_PHONE_STATE,
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.WRITE_EXTERNAL_STORAGE,
 };

第二步:-

代码语言:javascript
复制
private boolean checkPermissions() {
    int result;
    List<String> listPermissionsNeeded = new ArrayList<>();
    for (String p : permissions) {
        result = ContextCompat.checkSelfPermission(this, p);
        if (result != PackageManager.PERMISSION_GRANTED) {
             listPermissionsNeeded.add(p);
        }
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), 100);
        return false;
    }
    return true;
}

第3步:

代码语言:javascript
复制
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    if (requestCode == 100) {
        if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // do something
        }
        return;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-18 20:14:52

您正在onCreate中检查该权限。当您再次最小化和最大化应用程序时,不会调用该方法。

也许你应该在你需要的地方检查权限,或者至少在onResume中检查,当你重新打开你的应用程序时肯定会再次调用它。

onResume中调用它可以确保应用程序继续工作,如果用户在屏幕拆分的另一个窗口中禁用权限(Android N功能)。

票数 0
EN

Stack Overflow用户

发布于 2016-04-18 20:35:51

实现这一点的简单方法是使用ActivityCompat的直接静态方法

代码语言:javascript
复制
public static void requestPermissions(final @NonNull Activity activity,
            final @NonNull String[] permissions, final int requestCode)

在这里你可以看到你需要什么参数

-- Activity Instance

-- String array of permissions

-- a user defined request code

使用

定义全局变量

代码语言:javascript
复制
//Run-time permissions for MarshMallow +
    public final String[] PERMISSION_ALL = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.CAMERA,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };
    //validateRequestPermissionsRequestCode requires requestCode to be of 8 bits, i.e. range: 0-255.
    public final int PERMISSION_REQUEST_CODE = 100;

最后,在您的活动oncreate()方法中,您可以调用上面提到的静态函数

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity
{
    //your code here

     @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        //do other code work

        super.onCreate(savedInstanceState);

        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        if (currentapiVersion >= android.os.Build.VERSION_CODES.M)
        {
            ActivityCompat.requestPermissions(this, PERMISSION_ALL, PERMISSION_REQUEST_CODE);
        }

        //do other code work
    }

    //your code here
}

然后你就完成了..。

有关安卓运行时权限的更多信息,请查看Click here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36693564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档