检查权限并重新加载 activity

Check permissions and reload the activity

大家好,我在检查运行时权限后加载 activity 元素时遇到问题 我为 Lollipop 制作了一个应用程序,但现在我需要更新到 Marshmallow,所以我遇到了这个问题

我有一个 MainActivity

        public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;

        @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                setContentView(R.layout.activity_main);

                if(checkAndRequestPermissions(this)) {
                    //Var created
                    Internetstatus = (TextView) findViewById(R.id.statusInternet);

                    if (!verificaConexion(this)) {
                        Internetstatus.setText("NOT CONNECTED");
                    } else {
                        Internetstatus.setText("CONNECTED");
                    }
                }
            }


            public static boolean verificaConexion(Context ctx) {

                boolean bConectado = false;
                ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
                if (activeNetwork != null) {
                        bConectado = true;
                }
                return bConectado;
            }




        private  boolean checkAndRequestPermissions(Context ctx) {
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                Toast.makeText(this, "Checking permission…", Toast.LENGTH_SHORT).show ();
                //List of permissions
                int permissionInternet = ContextCompat.checkSelfPermission(this,
                        Manifest.permission.INTERNET);

                int permissionAccessNetwork = ContextCompat.checkSelfPermission(this,
                        Manifest.permission.ACCESS_NETWORK_STATE);

                int permissionReadExternal = ContextCompat.checkSelfPermission(this,
                        Manifest.permission.READ_EXTERNAL_STORAGE);
                int permissionWriteExternal = ContextCompat.checkSelfPermission(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE);


                List<String> listPermissionsNeeded = new ArrayList<>();

                //Verify status of permissions
                if (permissionInternet != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.INTERNET);
                }
                if (permissionAccessNetwork != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.ACCESS_NETWORK_STATE);
                }
                if (permissionReadExternal != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
                }
                if (permissionWriteExternal != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }


                if (!listPermissionsNeeded.isEmpty()) {
                    ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
                    return false;
                }


                return true;

            }
            return true;
        }


    }

是的,我在 activity 中有更多元素,但是对于示例来说,只有一个文本就可以了:),检查权限很好但是当我按下允许权限时 activity文本状态是默认文本 xD! "Small Text",所以 setText 不起作用,但如果我关闭应用程序并再次打开,一切都可以正常工作,因为我已经允许了权限。嘿,我是第一次做棉花糖的app,所以问题可能很蠢哈哈哈。

好吧,在那之后不工作我想也许如果我创建一个新的 activity LoadActivity 我可以在那里检查权限(移动功能检查和所有关于从 MainActivity 到 LoadActivity 的检查权限)并且如果条件是很好,我初始化了 MainActivity,这很好地启动了新的 activity (LoadActivity),我检查了权限,但是在我允许权限后启动 MainActivity 不起作用

新的 LoadActivity 是

public class LoadActivity extends AppCompatActivity {

    public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_load);

        if(checkAndRequestPermissions(this)) {
            Intent intent = new Intent(this, MainActivity.class);
            startActivityForResult(intent, 0);
        }


    }

    private  boolean checkAndRequestPermissions(Context ctx) {
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Toast.makeText(this, "Checking permission…", Toast.LENGTH_SHORT).show ();
            //List of permissions
            int permissionInternet = ContextCompat.checkSelfPermission(this,
                    Manifest.permission.INTERNET);

            int permissionAccessNetwork = ContextCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_NETWORK_STATE);

            int permissionReadExternal = ContextCompat.checkSelfPermission(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE);
            int permissionWriteExternal = ContextCompat.checkSelfPermission(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE);


            List<String> listPermissionsNeeded = new ArrayList<>();

            //Verify status of permissions
            if (permissionInternet != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.INTERNET);
            }
            if (permissionAccessNetwork != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.ACCESS_NETWORK_STATE);
            }
            if (permissionReadExternal != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
            }
            if (permissionWriteExternal != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            }


            if (!listPermissionsNeeded.isEmpty()) {
                ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
                return false;
            }


            return true;

        }
        return true;
    }
}

我希望有人能帮助我:D 问候

阅读此页: https://developer.android.com/training/permissions/requesting.html

主要问题是您请求权限然后 return false

if (!listPermissionsNeeded.isEmpty()) {
    ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
    return false;
}

所以这个if语句不会通过

if(checkAndRequestPermissions(this))

您必须实施 onRequestPermissionsResult() 正如评论中所说。

此外,你的方法是私有的而不是静态的,所以你不需要传递 Context 作为参数,你可以像你一样在里面调用 this ,只是指向不是很重要.

检查权限是否被授予,然后调用 setText 否则什么都不做。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(checkAndRequestPermissions(this)) { //Var created
        Internetstatus = (TextView) findViewById(R.id.statusInternet);
        if (!verificaConexion(this)) {
            Internetstatus.setText("NOT CONNECTED");
        } else {
            Internetstatus.setText("CONNECTED"); 
        } 
    } 
}

如果您想在授予权限后设置文本,那么您应该覆盖方法 onRequestPermissionResult 并从中再次调用 setText。 activity onCreate 方法授权后不会再调用

这就是为什么它在您关闭并重新打开应用程序时起作用的原因,因为您的应用程序的新打开会再次调用 activity onCreate,现在您的方法 checkAndRequestPermissions returns true => setText 将是叫

谢谢大家,现在我明白了,好吧,我贴上我的新功能代码,也许对其他人有帮助。

public class LoadActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_load);
        insertDummyContactWrapper();
    }

    final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;

    private void insertDummyContactWrapper() {
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            List<String> permissionsNeeded = new ArrayList<String>();

            final List<String> permissionsList = new ArrayList<String>();
            if (!addPermission(permissionsList, Manifest.permission.INTERNET))
                permissionsNeeded.add("Internet.");
            if (!addPermission(permissionsList, Manifest.permission.ACCESS_NETWORK_STATE))
                permissionsNeeded.add("Internet Status.");
            if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE))
                permissionsNeeded.add("Read Files.");
            if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE))
                permissionsNeeded.add("Write Files.");

            if (permissionsList.size() > 0) {
                if (permissionsNeeded.size() > 0) {
                    // Need Rationale
                    String message = "You need to grant access to " + permissionsNeeded.get(0);
                    for (int i = 1; i < permissionsNeeded.size(); i++)
                        message = message + ", " + permissionsNeeded.get(i);
                    showMessageOKCancel(message,
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                        requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                                                REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
                                    }
                                }
                            });
                    return;
                }
                requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                        REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
                return;
            }
        }
        startApp();

    }

    private boolean addPermission(List<String> permissionsList, String permission) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                permissionsList.add(permission);
                // Check for Rationale Option
                if (!shouldShowRequestPermissionRationale(permission))
                    return false;
            }
        }
        return true;
    }

    private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(LoadActivity.this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show();
    }




    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS:
            {
                Map<String, Integer> perms = new HashMap<String, Integer>();
                // Initial
                perms.put(Manifest.permission.INTERNET, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.ACCESS_NETWORK_STATE, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                // Fill with results
                for (int i = 0; i < permissions.length; i++)
                    perms.put(permissions[i], grantResults[i]);
                // Check for ACCESS_FINE_LOCATION
                if (perms.get(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                    // All Permissions Granted
                    startApp();
                } else {
                    // Permission Denied
                    Toast.makeText(LoadActivity.this, "Some Permission is Denied, please allow permission for that the app can work.", Toast.LENGTH_SHORT)
                            .show();
                }
            }
            break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }


    private void startApp(){
        Intent intent = new Intent(this, MainActivity.class);
        startActivityForResult(intent, 0);
    }


}

希望对大家有帮助:D

为了使它成为我基于其他用户评论的文章,​​最后来自这篇文章

https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

并向新手推荐此视频 android marshmallow

https://www.youtube.com/watch?v=C8lUdPVSzDk

此致!

通过实现接口ActivityCompat.OnRequestPermissionsResultCallback,我们可以检查用户是否被授予请求权限。如果给定,我们可以通过实现名为 onRequestPermissionsResult 的方法再次加载 activity。有关详细信息,请查看此 link https://developer.android.com/training/permissions/requesting.html

public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback  {

protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                if(isStoragePermissionGranted()) {
                    // code to implement after permission granted
                }
        }

    public  boolean isStoragePermissionGranted() {
        String TAG = "logcheck";
        if (Build.VERSION.SDK_INT >= 23) {
            if (checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED ) {
                Log.v(TAG,"Permission is granted");
                return true;
            } else {

                Log.v(TAG,"Permission is revoked");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                return false;
            }
        }
        else { //permission is automatically granted on sdk<23 upon installation
            Log.v(TAG,"Permission is granted");
            return true;
        }
    }     

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

                    boolean flag;
                    flag = true;
                    if(requestCode == 1)
                    {
                        for (int i:grantResults)
                        {
                            if( i == PackageManager.PERMISSION_DENIED)
                                flag = false;

                        }
                        if (flag)
                        {
                            Intent intent = new Intent(this,MainActivity.class);
                            finish();
                            startActivity(intent);
                        }
                    }
                }
            }