【问题标题】:Android M permissions close my appAndroid M 权限关闭我的应用
【发布时间】:2016-12-15 03:50:21
【问题描述】:

我在我的登录屏幕上检查所需的权限。对话框显示询问我需要的 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);

【问题讨论】:

  • 无法理解你实际上在做什么
  • @MohammedAtif 检查是否在运行时授予权限,因为在 Android M 之后,权限不是在安装期间授予,而是在应用启动后授予。
  • @N.Park 检查我的答案stackoverflow.com/a/33163206/3395198
  • @IntelliJAmiya 谢谢。我试过你的回答,但屏幕还是黑屏,这次只显示一个对话框来获得第一个权限。
  • 您甚至没有夸大任何视图或向此特殊权限请求活动添加适当的操作。这就是为什么您会出现空白屏幕并关闭应用程序的原因。尝试在您的 loginActivity 本身中实现权限,而不是创建其他类。

标签: android android-6.0-marshmallow android-permissions


【解决方案1】:

在任何 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:noHistory="true"

    【讨论】:

    • 请详细说明一下
    【解决方案3】:

    同样的问题。

    ankit jain 在赛道上。删除 android:noHistory="true" 修复了 N.Park 问题。

    尽管在我的情况下,我需要该值是真实的,或者至少是产生的行为(我有一个 SplashScreen 来管理权限,然后继续前进,我希望该 Activity 退出我的堆栈)。

    所以:

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

    2. 在活动中我管理权限没有问题

    3. 之后,我进入下一个活动:

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

    【讨论】:

    • 删除 android:noHistory="true" 解决了问题
    【解决方案4】:

    只写几行代码:

     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   
         }
     }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-09
        • 2015-12-19
        • 2016-03-25
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 2016-06-30
        • 2015-12-23
        相关资源
        最近更新 更多