Android M权限关闭我的应用程序。

16

我在我的登录界面上检查所需的权限。对话框弹出请求我需要的4个权限。一切正常,但是当对话框出现时,背景变成黑色,我的应用程序关闭(不会崩溃,只是关闭)。当我完成选择权限后,再次打开应用程序,它将从停止的地方继续运行。如何使应用程序在显示权限对话框时继续运行?我使用一个类来检查权限,并在登录活动中调用它。

这个类:

public abstract class RuntimePermissionsActivity extends AppCompatActivity {
private SparseIntArray mErrorString;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    mErrorString = new SparseIntArray();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    int permissionCheck = PackageManager.PERMISSION_GRANTED;
    for (int permission : grantResults){
        permissionCheck = permissionCheck + permission;
    }
    if ((grantResults.length>0) && permissionCheck == PackageManager.PERMISSION_GRANTED){
        onPermissionsGranted(requestCode);
    }
    else {

                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.setData(Uri.parse("package:" + getPackageName()));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                startActivity(intent);
    }
}

public void requestAppPermissions(final String[] requestedPermissions, final int requestCode){
    int stringId = 0;
    mErrorString.put(requestCode, stringId);
    int permissionCheck = PackageManager.PERMISSION_GRANTED;
    boolean shouldShowRequestPermissionRationale = false;
    for (String permission : requestedPermissions){
        permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission);
        shouldShowRequestPermissionRationale = ActivityCompat.shouldShowRequestPermissionRationale(this, permission);
    }
    if(permissionCheck != PackageManager.PERMISSION_GRANTED){
        if(shouldShowRequestPermissionRationale){
                    ActivityCompat.requestPermissions(RuntimePermissionsActivity.this, requestedPermissions, requestCode);
        }
        else {
            ActivityCompat.requestPermissions(this, requestedPermissions, requestCode);
            Toast.makeText(RuntimePermissionsActivity.this, "Please relaunch the application in order for the changes to take effect!", Toast.LENGTH_LONG).show();
        }
    }
    else {
        onPermissionsGranted(requestCode);
    }

}
public abstract void onPermissionsGranted(int requestCode);
}

登录活动调用:

LoginActivity.super.requestAppPermissions(new
            String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS);

无法理解你实际在做什么。 - Mohammed Atif
@MohammedAtif 检查运行时是否授予权限,因为在 Android M 之后,权限不会在安装期间授予,而是在应用程序启动后授予。 - N. Park
@N.Park请查看我的答案https://dev59.com/J1wX5IYBdhLWcg3w-Thv#33163206 - IntelliJ Amiya
1
@IntelliJAmiya 谢谢。我尝试了你的答案,但屏幕仍然变黑,这次只显示了一个对于第一个权限的对话框。 - N. Park
1
你甚至没有填充任何视图或为这个特殊权限请求活动添加适当的操作。这就是为什么你会得到一个空白屏幕并且应用程序关闭的原因。尝试在你的loginActivity中实现权限,而不是创建额外的类。 - Mohammed Atif
显示剩余4条评论
5个回答

17

我遇到了同样的问题,请检查你的清单文件中是否有android:noHistory="true"这个属性设置在活动中。


1
请详细说明一下。 - Panther

11

我也遇到了同样的问题。

ankit jain 找到了解决方案。移除 android:noHistory="true" 可以修复 N.Park 的问题。

虽然在我的情况下,我需要该值为真,或者至少具有相应的行为 (我有一个 SplashScreen 用于管理权限,在进行后续操作后,我希望将该 Activity 从堆栈中移除)。

因此:

  1. 我删除了 android:noHistory="true" 这一行

  2. 在我处理权限的 Activity 中没有出现问题

  3. 之后,我使用以下代码进入下一个 Activity:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );

移除 android:noHistory="true" 解决了问题。 - Greelings

6
在任何Activity中实现权限的示例。
SampleActivity.java
public class SampleActivity extends AppCompatActivity{
    private final int PERMISSION_CODE = 1;
    Button button;
    @override
    onCreate(Bundle savedInstance){
        super.onCreate(savedInstance);
        setContentView(R.layout.your_layout);
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener(){
            @override
            public void onClick(View view){
                requestPermissionAndContinue();
            }
        });
        //remaining code to continue using the app
        //your actual code should also be in this same class
    }

    private void requestPermissionAndContinue(){
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){
            if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)){
                Log.e(TAG, "permission denied, show dialog");
            }else{
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, PERMISSION_CODE);
            }
        }else{
            accessContacts();
        }
    }

    private void accessContacts(){
        //your code once you receive permission
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(grantResults.length > 0 && permissions[0]==PackageManager.PERMISSION_GRANTED){
            accessContacts();
        }else{
             //redirect to settings page or ask permission again
        }
    }
}

2
从Android清单文件的相应RuntimePermissionsActivity标记中删除android:noHistory="true"属性即可解决该问题。

0

只需写几行代码:

 final int requestCode=100;
 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ) {
     String[] per = {Manifest.permission.READ_CONTACTS};
     requestPermissions(per, requestCode);

     if (ActivityCompat.checkSelfPermission(CollectZone.this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
         // recall permission until is not permitted
     } else { 
         // write execution code here   
     }
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接