Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android M权限关闭我的应用程序_Android_Android 6.0 Marshmallow_Android Permissions - Fatal编程技术网

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

Android M权限关闭我的应用程序,android,android-6.0-marshmallow,android-permissions,Android,Android 6.0 Marshmallow,Android Permissions,我在登录屏幕上检查所需的权限。该对话框显示请求我所需的4个权限。一切正常,但当对话框出现时,背景变黑,我的应用程序关闭(不会崩溃,只是关闭)。当我选择完权限后,我再次打开应用程序,它将从停止的位置继续运行。在显示权限对话框时,如何使应用程序继续运行?我使用一个类来检查权限并在登录活动中调用它 班级: public abstract class RuntimePermissionsActivity extends AppCompatActivity { private SparseIntArray

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

在任何活动中实现权限的示例

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

我也面临同样的问题,检查清单文件中的activity
android:noHistory=“true”

这里也有同样的问题

安基特·詹在赛道上。删除android:noHistory=“true”修复了N.Park问题

尽管在我的例子中,我需要该值为真,或者至少是它所产生的行为(我有一个SplashScreen,在那里我管理权限,在继续之后,我希望该活动从我的堆栈中退出)

因此:

  • 我删除了行
    android:noHistory=“true”

  • 在活动中,我可以毫无问题地管理权限

  • 之后,我将进入下一个活动:


  • 只写几行代码:

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

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

    无法理解您的实际身份doing@MohammedAtif检查是否在运行时授予权限,因为在Android M之后,在安装过程中没有授予权限,但在应用程序启动后。@N.Park检查我的答案@IntelliJAmiya谢谢。我尝试了你的答案,但屏幕还是变黑了,这一次只显示了第一个权限的一个对话框。你甚至没有扩大任何视图,也没有为这个特殊的权限请求活动添加适当的操作。这就是为什么你会看到一个空白屏幕,应用程序会关闭。尝试在您的loginActivity本身中实现权限,而不是创建额外的类。请重新编辑一下。删除android:noHistory=“true”解决了这个问题
     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   
         }
     }