如何请求在Android M上访问图库的权限?

2022-09-02 23:33:22

我有这个应用程序,它将选择图像到图库,并使用图像视图将其显示到测试中。我的问题是它不适用于Android M。我可以选择图像,但不会在我的测试中显示。他们说我需要请求许可才能访问android M上的图像,但不知道如何操作。请帮忙。


答案 1

从 Android 6.0(API 级别 23)开始,用户会在应用运行时(而不是在安装应用时)向应用授予权限。

类型 1-当你的应用请求权限时,系统会向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,并将其传递给用户响应。你的应用必须重写该方法才能确定是否已授予权限。回调将传递到您传递给 requestPermissions() 的相同请求代码。

private static final int PICK_FROM_GALLERY = 1;

ChoosePhoto.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick (View v){
    try {
        if (ActivityCompat.checkSelfPermission(EditProfileActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(EditProfileActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, PICK_FROM_GALLERY);
        } else {
            Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(galleryIntent, PICK_FROM_GALLERY);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
});


@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults)
    {
       switch (requestCode) {
            case PICK_FROM_GALLERY:
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                  Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                  startActivityForResult(galleryIntent, PICK_FROM_GALLERY);
                } else {
                    //do something like displaying a message that he didn`t allow the app to access gallery and you wont be able to let him select from gallery
                }
                break;
        }
    }

类型 2-如果您想在一个地方背靠背授予运行时权限,那么您可以按照下面的链接

安卓6.0多重权限

在清单中,为您的要求添加权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

注意-如果Manifest.permission.READ_EXTERNAL_STORAGE产生错误,请将其替换为Android。Manifest.permission.READ_EXTERNAL_STORAGE。

==>如果您想了解有关运行时权限的更多信息,请按照以下链接进行操作

https://developer.android.com/training/permissions/requesting.html

-----------------------------更新 1--------------------------------

使用 EasyPermissions 的运行时权限

EasyPermissions 是一个包装器库,用于在面向 Android M 或更高版本时简化基本的系统权限逻辑。

安装在应用级别级别级别中添加依赖项

 dependencies {
// For developers using AndroidX in their applications
implementation 'pub.devrel:easypermissions:3.0.0'

// For developers using the Android Support Library
implementation 'pub.devrel:easypermissions:2.0.1'
}

您的活动(或片段)将覆盖 onRequestPermissionsResult 方法:

 @Override
     public void onRequestPermissionsResult(int requestCode, String[] 
    permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions,grantResults);

        // Forward results to EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

请求权限

private static final int LOCATION_REQUEST = 222;

调用此方法

@AfterPermissionGranted(LOCATION_REQUEST)
private void checkLocationRequest() {
   String[] perms = {Manifest.permission.ACCESS_FINE_LOCATION};
    if (EasyPermissions.hasPermissions(this, perms)) {
        // Already have permission, do the thing
        // ...
    } else {
        // Do not have permissions, request them now
        EasyPermissions.requestPermissions(this,"Please grant permission",
                LOCATION_REQUEST, perms);
    }
}

(可选)对于更精细的控件,您可以让活动/片段实现 PermissionCallbacks 接口。

实现 EasyPermissions.PermissionCallbacks

 @Override
public void onPermissionsGranted(int requestCode, List<String> list) {
    // Some permissions have been granted
    // ...
}

@Override
public void onPermissionsDenied(int requestCode, List<String> list) {
    // Some permissions have been denied
    // ...
}

友情链接->https://github.com/googlesamples/easypermissions

-----------------------------更新 2 对于 KOTLIN--------------------------------

运行时权限 使用 florent37

安装在应用级别级别级别中添加依赖项

屬地

implementation 'com.github.florent37:runtime-permission-kotlin:1.1.2'

在代码中

        askPermission(
        Manifest.permission.CAMERA,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    ) {
       // camera or gallery or TODO
    }.onDeclined { e ->
        if (e.hasDenied()) {
            AlertDialog.Builder(this)
                .setMessage(getString(R.string.grant_permission))
                .setPositiveButton(getString(R.string.yes)) { dialog, which ->
                    e.askAgain()
                } //ask again
                .setNegativeButton(getString(R.string.no)) { dialog, which ->
                    dialog.dismiss()
                }
                .show()
        }

        if (e.hasForeverDenied()) {
            e.goToSettings()
        }
    }

链接>https://github.com/florent37/RuntimePermission


答案 2
public void pickFile() {
        int permissionCheck = ContextCompat.checkSelfPermission(getActivity(),
                CAMERA);
        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    getActivity(),
                    new String[]{CAMERA},
                    PERMISSION_CODE
            );
            return;
        }
        openCamera();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
                                           @NonNull int[] grantResults) {
        if (requestCode == PERMISSION_CODE) {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                openCamera();
            }
        }
    }

    private void openCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, CAMERA_CODE);
    }


<uses-permission android:name="android.permission.CAMERA" />

推荐