Android 方法中声明的最终静态布尔变量

Android 方法中声明的最终静态布尔变量,android,variables,scope,sharedpreferences,Android,Variables,Scope,Sharedpreferences,我有一个摄像头权限按钮,在按钮上点击listener我有以下两个主要条件。 1:如果获得许可,只需进入摄像机活动。。。 2:else检查2个进一步的条件(1:i检查(使用布尔变量)如果“不再请求权限”已在对话框中签入,则转到设置…2:else请求权限) 在onRequestPermissionsResult方法中,我检查了用户是否授予权限,然后转到相机活动。。。else检查用户是否选中“不再请求权限”将布尔变量else show权限设置为true被拒绝 一切正常,但当我重新启动活动时,它会将该布

我有一个摄像头权限按钮,在按钮上点击listener我有以下两个主要条件。 1:如果获得许可,只需进入摄像机活动。。。 2:else检查2个进一步的条件(1:i检查(使用布尔变量)如果“不再请求权限”已在对话框中签入,则转到设置…2:else请求权限)

在onRequestPermissionsResult方法中,我检查了用户是否授予权限,然后转到相机活动。。。else检查用户是否选中“不再请求权限”将布尔变量else show权限设置为true被拒绝

一切正常,但当我重新启动活动时,它会将该布尔变量设置为false(现在,如果用户上次可能已选中“不再请求权限”),它应该将用户带到设置中,但在第一次单击时它不会,单击一次(当该布尔变量设置为true)后,它将工作。 所以我的问题是如何在onRequestPermissionsResult方法中设置布尔变量final(这样它在活动重新启动时不会更改),并在onCreate方法中使用它(超出范围)

下面是onCreate中的按钮onclick侦听器代码

                if (checkPermission())
               {

                Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

                startActivityForResult(intent, 7);
               // Toast.makeText(GalleryImageSelection.this,"CAMERA permission allows us to Access CAMERA app", Toast.LENGTH_LONG).show();

            }
            else {
                if (test){ //test is that boolean variable
                    Uri packageUri = Uri.fromParts( "package", getApplicationContext().getPackageName(), null );

                    Intent intent = new Intent();

                    intent.setAction( Settings.ACTION_APPLICATION_DETAILS_SETTINGS );
                    intent.setData( packageUri );
                    intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );

                    startActivity( intent );
                }else {
                ActivityCompat.requestPermissions(GalleryImageSelection.this,new String[]{
                        Manifest.permission.CAMERA}, RequestPermissionCode);

            } }
以下是onRequestPermissionsResult方法代码

@Override
public void onRequestPermissionsResult(int RC, String per[], int[] PResult) {

    switch (RC) {

        case RequestPermissionCode:

                if (PResult[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(GalleryImageSelection.this, "Permission Granted, Now your application can access CAMERA.", Toast.LENGTH_LONG).show();

                    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(intent, 7);

                } else {
                   // for (int i = 0, len = per.length; i < len; i++) {
                     //   String permission = per[i];
                        if (PResult[0] == PackageManager.PERMISSION_DENIED){
                    boolean showRational =shouldShowRequestPermissionRationale(per[0]);
                    if (!showRational){
                        test = true;//test is declared above onCreate for 
                                    //scope purpose
                    }
                    else if (CAMERA.equals(per[0])) {
                        Toast.makeText(GalleryImageSelection.this, "Permission Denied, your application cannot access CAMERA.", Toast.LENGTH_LONG).show();

                    }
                }
                    }

                break;
            }
    }
@覆盖
public void onRequestPermissionsResult(int-RC,字符串per[],int[]PResult){
开关(RC){
案例请求许可代码:
if(假定[0]==已授予PackageManager.PERMISSION){
Toast.makeText(GalleryImageSelection.this,“已授予权限,现在您的应用程序可以访问摄像头。”,Toast.LENGTH_LONG.show();
Intent Intent=新Intent(android.provider.MediaStore.ACTION\u IMAGE\u CAPTURE);
startActivityForResult(意向书,7);
}否则{
//for(int i=0,len=per.length;i
无需使用该布尔值来处理权限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (checkSelfPermission(Manifest.permission.CAMERA)  != PackageManager.PERMISSION_GRANTED) {
                        requestPermissions(new String[]{Manifest.permission.CAMERA}, 1001);
                    } else {
                       Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                    }
                } else {
                    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                } 
而在onRequestPermissionsResult中

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults != null && grantResults.length > 0) {
            switch (requestCode) {
                case 1001:
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                         Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                    } else {
                         if (ActivityCompat.shouldShowRequestPermissionRationale(HomeActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                        Toast.makeText(this, "Please allow permission", Toast.LENGTH_SHORT).show();
                    } else {
                        AlertDialog dialog= new AlertDialog.Builder(HomeActivity.this)
                                .setMessage("Apply permission")
                                .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {

                                    public void onClick(DialogInterface dialog, int whichButton) {
                                        Uri packageUri = Uri.fromParts( "package", getApplicationContext().getPackageName(), null );
                                        Intent intent = new Intent();
                                        intent.setAction( Settings.ACTION_APPLICATION_DETAILS_SETTINGS );
                                        intent.setData( packageUri );
                                        intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
                                        startActivity( intent );
                                    }

                                })
                                .create();
                        dialog.show();
                    }
                    }
                    break;

            }
        }
    }

不需要使用该布尔值来处理权限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (checkSelfPermission(Manifest.permission.CAMERA)  != PackageManager.PERMISSION_GRANTED) {
                        requestPermissions(new String[]{Manifest.permission.CAMERA}, 1001);
                    } else {
                       Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                    }
                } else {
                    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                } 
而在onRequestPermissionsResult中

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults != null && grantResults.length > 0) {
            switch (requestCode) {
                case 1001:
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                         Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                    } else {
                         if (ActivityCompat.shouldShowRequestPermissionRationale(HomeActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                        Toast.makeText(this, "Please allow permission", Toast.LENGTH_SHORT).show();
                    } else {
                        AlertDialog dialog= new AlertDialog.Builder(HomeActivity.this)
                                .setMessage("Apply permission")
                                .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {

                                    public void onClick(DialogInterface dialog, int whichButton) {
                                        Uri packageUri = Uri.fromParts( "package", getApplicationContext().getPackageName(), null );
                                        Intent intent = new Intent();
                                        intent.setAction( Settings.ACTION_APPLICATION_DETAILS_SETTINGS );
                                        intent.setData( packageUri );
                                        intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
                                        startActivity( intent );
                                    }

                                })
                                .create();
                        dialog.show();
                    }
                    }
                    break;

            }
        }
    }
您可以在onRequestPermissionsResult上使用

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults != null && grantResults.length > 0) {
            switch (requestCode) {
                case 1001:
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                         Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                    } else {
                         if (ActivityCompat.shouldShowRequestPermissionRationale(HomeActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                        Toast.makeText(this, "Please allow permission", Toast.LENGTH_SHORT).show();
                    } else {
                        AlertDialog dialog= new AlertDialog.Builder(HomeActivity.this)
                                .setMessage("Apply permission")
                                .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {

                                    public void onClick(DialogInterface dialog, int whichButton) {
                                        Uri packageUri = Uri.fromParts( "package", getApplicationContext().getPackageName(), null );
                                        Intent intent = new Intent();
                                        intent.setAction( Settings.ACTION_APPLICATION_DETAILS_SETTINGS );
                                        intent.setData( packageUri );
                                        intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
                                        startActivity( intent );
                                    }

                                })
                                .create();
                        dialog.show();
                    }
                    }
                    break;

            }
        }
    }
原始答案:

您可以在onRequestPermissionsResult上使用

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults != null && grantResults.length > 0) {
            switch (requestCode) {
                case 1001:
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                         Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 7);
                    } else {
                         if (ActivityCompat.shouldShowRequestPermissionRationale(HomeActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                        Toast.makeText(this, "Please allow permission", Toast.LENGTH_SHORT).show();
                    } else {
                        AlertDialog dialog= new AlertDialog.Builder(HomeActivity.this)
                                .setMessage("Apply permission")
                                .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {

                                    public void onClick(DialogInterface dialog, int whichButton) {
                                        Uri packageUri = Uri.fromParts( "package", getApplicationContext().getPackageName(), null );
                                        Intent intent = new Intent();
                                        intent.setAction( Settings.ACTION_APPLICATION_DETAILS_SETTINGS );
                                        intent.setData( packageUri );
                                        intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
                                        startActivity( intent );
                                    }

                                })
                                .create();
                        dialog.show();
                    }
                    }
                    break;

            }
        }
    }

原始答案:

我使用SharedReference解决了这个问题。我将布尔值放入SharedReference中,如下所示:

if (!showRational){
                        boolean isChecked= true;
                        sharedpreferences = getSharedPreferences(mypreference,
                                Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedpreferences.edit();
                        editor.putBoolean("isChecked", isChecked);
                        editor.commit();
                    }
 sharedpreferences = getSharedPreferences(mypreference,
                    Context.MODE_PRIVATE);
            boolean checked = sharedpreferences.getBoolean("isChecked", false);
            if (checkPermission())
            {
                Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, 7);
            }
            else if(checked)
            {
                openSetting();
            }else {

                requestPermission();
            }
然后点击按钮进入,如下所示:

if (!showRational){
                        boolean isChecked= true;
                        sharedpreferences = getSharedPreferences(mypreference,
                                Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedpreferences.edit();
                        editor.putBoolean("isChecked", isChecked);
                        editor.commit();
                    }
 sharedpreferences = getSharedPreferences(mypreference,
                    Context.MODE_PRIVATE);
            boolean checked = sharedpreferences.getBoolean("isChecked", false);
            if (checkPermission())
            {
                Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, 7);
            }
            else if(checked)
            {
                openSetting();
            }else {

                requestPermission();
            }
现在,当我重新启动活动时,它不会更改布尔变量的值

所以结论是“如果有人想使用变量:

-应在一个方法中声明和初始化,并在另一个方法中调用(超出范围), -(或)在一个方法中需要初始化一次,然后永远不应该更改,并且在任何方法中都应该可用


我们将在SharedReference中保存该变量的值,并将其放在任何需要的地方。

我使用SharedReference解决了它。我将布尔值放在SharedReference中,如下所示:

if (!showRational){
                        boolean isChecked= true;
                        sharedpreferences = getSharedPreferences(mypreference,
                                Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedpreferences.edit();
                        editor.putBoolean("isChecked", isChecked);
                        editor.commit();
                    }
 sharedpreferences = getSharedPreferences(mypreference,
                    Context.MODE_PRIVATE);
            boolean checked = sharedpreferences.getBoolean("isChecked", false);
            if (checkPermission())
            {
                Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, 7);
            }
            else if(checked)
            {
                openSetting();
            }else {

                requestPermission();
            }
然后点击按钮进入,如下所示:

if (!showRational){
                        boolean isChecked= true;
                        sharedpreferences = getSharedPreferences(mypreference,
                                Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedpreferences.edit();
                        editor.putBoolean("isChecked", isChecked);
                        editor.commit();
                    }
 sharedpreferences = getSharedPreferences(mypreference,
                    Context.MODE_PRIVATE);
            boolean checked = sharedpreferences.getBoolean("isChecked", false);
            if (checkPermission())
            {
                Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, 7);
            }
            else if(checked)
            {
                openSetting();
            }else {

                requestPermission();
            }
现在,当我重新启动活动时,它不会更改布尔变量的值

所以结论是“如果有人想使用变量:

-应在一个方法中声明和初始化,并在另一个方法中调用(超出范围), -(或)在一个方法中需要初始化一次,然后永远不应该更改,并且在任何方法中都应该可用


我们将在SharedReference中保存该变量的值,并将其获取到所需的任何位置。

为什么不使用SharedReference跟踪。为什么不使用SharedReference跟踪。没有帮助,我正在处理此案例“当应用程序显示“请求权限”对话框时,如果用户单击“不再显示”复选框并拒绝该权限,则下次用户再次单击“请求权限”按钮时,它应将用户带到“设置”中。它可以工作,但问题是当用户重新启动活动时,它第一次将不工作,没有帮助,我正在处理此案例。”“当应用程序显示“请求权限”对话框时,如果用户单击“不再显示”复选框并拒绝该权限,则下次用户再次单击按钮时,它应将用户带到“设置”中。它可以工作,但问题是当用户重新启动活动时,它第一次将无法工作,