Android的6许可法(理解) [英] Android 6 permission method (Understanding)

查看:292
本文介绍了Android的6许可法(理解)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从画廊拍摄图像,并把它设置为一个ImageView的,但是在android系统6也有一些权限问题。所以在这里是要求permission.Should我要求读取外部存储或写入外部存储方法? ??
以下是我迄今所做的:

I am trying to take an image from Gallery and set it to an imageview but in android 6 there are some permission problem.So here is the method to ask for permission.Should i ask for read external storage or write external storage??? here is what i have done so far:

    private static final int READ_CONTACTS_PERMISSIONS_REQUEST = 1;


    public void getPermissionToReadExternalStorage() {

    if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        if (shouldShowRequestPermissionRationale(
                Manifest.permission.READ_EXTERNAL_STORAGE)) {

            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    READ_CONTACTS_PERMISSIONS_REQUEST);
        }}}
    @Override
            public void onRequestPermissionsResult(int requestCode,
                                                   @NonNull String permissions[],
                                                   @NonNull int[] grantResults){
                // Make sure it's our original READ_CONTACTS request
                if (requestCode == READ_CONTACTS_PERMISSIONS_REQUEST) {
                    if (grantResults.length == 1 &&
                            grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        Toast.makeText(getActivity(), "Read Contacts permission granted", Toast.LENGTH_SHORT).show();

                    } else {
                        Toast.makeText(getActivity(), "Read Contacts permission denied", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                }
            }

现在我的点击监听器从画廊挑选数据:

Now My on Click listener to pick Data from Gallery:

     pro.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            intent.setType("image/*");
            if (android.os.Build.VERSION.SDK_INT >= 23) {
                getPermissionToReadExternalStorage();
                if (getPermissionToReadExternalStorage () this???? <==)
                startActivityForResult(Intent.createChooser(intent, "Select Picture"), 0);
            } else {
                startActivityForResult(Intent.createChooser(intent, "Select Picture"), 0);
        }}

    });
    return v;
}

现在我想要得到的方法getPermissionToReadExternalStorage(),这样我就可以开始采摘画廊为Android 6.活动的结果如何,我可以得到虚空类的结果。?????
而另一件事是我必须写方法,为每一位我的应用程序要求的权限????

now i want to get result of the method getPermissionToReadExternalStorage() so i can start the Activity for picking gallery for android 6. how can i get result of the void class.????? and another thing is Do i have to write method for every permission my app asks for ????

推荐答案

所以,我已经完全重写了code到请求的权限。
现在,它支持请求多个权限运行code。与正确的结果。
此外,它适用于preMarshmallow设备,因此您不必检查和复制code在这种情况下。

So I have completely rewritten the code to request permissions. Now it supports requesting for multiple permissions and running code with proper result. Also it works with preMarshmallow devices, so you don't have to check and copy the code in that case.

首先,创建与此code一个Activity类(可以扩展你需要活动的任何国王,例如AppCompatActivity):

First, create an Activity class with this code (You can extend any king of activity you need, e.g. AppCompatActivity):

public abstract class PermissionActivity extends AppCompatActivity {

private ArrayList<PermissionListener> permissionListeners = new ArrayList<>();

public void requestPermissions(int requestCode, String[] requestPermissions, PermissionListener permissionListener) {
    int[] grantResults = new int[requestPermissions.length];

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        ArrayList<String> list_notGranted = new ArrayList<>();

        for (String requestPermission : requestPermissions) {
            int granted = ContextCompat.checkSelfPermission(this, requestPermission);

            if (granted != PackageManager.PERMISSION_GRANTED)
                list_notGranted.add(requestPermission);
        }

        if (list_notGranted.size() > 0) {
            permissionListeners.add(permissionListener);

            requestPermissions = list_notGranted.toArray(new String[list_notGranted.size()]);

            super.requestPermissions(requestPermissions, requestCode);
        } else {
            for (int i = 0; i < grantResults.length; i++)
                grantResults[i] = PackageManager.PERMISSION_GRANTED;

            if (permissionListener != null)
                permissionListener.onResult(requestCode, requestPermissions, grantResults);
        }
    } else {
        for (int i = 0; i < grantResults.length; i++)
            grantResults[i] = PackageManager.PERMISSION_GRANTED;

        if (permissionListener != null)
            permissionListener.onResult(requestCode, requestPermissions, grantResults);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    for (PermissionListener permissionListener : permissionListeners)
        if (permissionListener.onResult(requestCode, permissions, grantResults)) {
            permissionListeners.remove(permissionListener);
        }
}

public interface PermissionListener {

    boolean onResult(int requestCode, String[] requestPermissions, int[] grantResults);

}}

如果您想从片段请求的权限,添加这个类:

If you want to request permissions from Fragments, add this class:

public abstract class PermissionFragment extends Fragment {

public void requestPermissions(int requestCode, String[] requestPermissions, PermissionActivity.PermissionListener permissionListener) {
    Activity activity = getActivity();

    if (activity != null && activity instanceof PermissionActivity) {
        ((PermissionActivity) activity).requestPermissions(requestCode, requestPermissions, permissionListener);
    } else {
        throw new IllegalStateException("Parent activity should be an instance of PermissionActivity");
    }
}}

您的活动和碎片应扩大这些类而不是那些非标准

Your Activities and Fragments should extend these classes instead of the standart ones.

现在您就可以通过调用方法来请求的权限:

Now you are ready to request the permissions by calling a method:

requestPermissions(int requestCode, String[] requestPermissions, PermissionListener permissionListener)

DONT MISSCALL默认的方法,这是

DONT MISSCALL THE DEFAULT METHOD, WHICH IS

// DON'T USE THIS ONE!
requestPermissions(String[] requestPermissions, int requestCode)
// DON'T USE THIS ONE!

下面是联系人请求的例子:

Here is the example of requesting contacts:

private void requestAndLoadContacts() {
    String[] permissions = new String[]{Manifest.permission.READ_CONTACTS};

    requestPermissions(REQUEST_PERMISSIONS_CONTACTS, permissions, new PermissionListener() {

        @Override
        public boolean onResult(int requestCode, String[] requestPermissions, int[] grantResults) {
            // Check if the requestCode is ours
            if (requestCode == REQUEST_PERMISSIONS_CONTACTS) {
                // Check if the permission is correct and is granted
                if (requestPermissions[0].equals(Manifest.permission.READ_CONTACTS) && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Permission granted
                    // Calling a method to actually load the contacts
                    loadContacts();
                } else {
                    // Permission not granted
                    Toast.makeText(MainActivity.this, "Access denied!", Toast.LENGTH_SHORT).show();
                }

                return true;
            }

            return false;
        }
    });
}

请注意:
当你实现了PermissionListener,不要忘记为返回true 请求code是正确

这篇关于Android的6许可法(理解)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆