【问题标题】:如何检查权限和请求权限(易于编码和易于理解)
【发布时间】:2020-06-04 11:14:10
【问题描述】:

我在 android 中搜索 Run-Time-Permission 并找到很多链接,但我看到代码很复杂。

注意:我在这里分享我的简单代码,以便对新开发人员或 Fraser 有所帮助。另外,我在这里没有使用任何第三方库。

【问题讨论】:

标签: android android-permissions


【解决方案1】:

首先,Manifest 文件中的写入权限(我有一些基本权限):

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

现在我做了两个方法 checkPermission()requestPermission() 还有@Override 一个方法名称是 onRequestPermissionsResult() 这是采取关心结果。

现在我将向您展示它的外观:

private boolean checkPermission() {
        int internetPermission = ContextCompat.checkSelfPermission(getApplicationContext(), INTERNET);
        int cameraPermission = ContextCompat.checkSelfPermission(getApplicationContext(), CAMERA);
        int readStoragePermission = ContextCompat.checkSelfPermission(getApplicationContext(), READ_EXTERNAL_STORAGE);
        int writeStoragePermission = ContextCompat.checkSelfPermission(getApplicationContext(), WRITE_EXTERNAL_STORAGE);

        return internetPermission == PackageManager.PERMISSION_GRANTED &&
                cameraPermission == PackageManager.PERMISSION_GRANTED &&
                readStoragePermission == PackageManager.PERMISSION_GRANTED &&
                writeStoragePermission == PackageManager.PERMISSION_GRANTED;
    }

您在上面的代码中看到定义了 INTERNET、CAMERA 等。这是通过单击 Alt + Enter 导入的,它看起来像下面的代码:

import static android.Manifest.permission.CAMERA;
import static android.Manifest.permission.INTERNET;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

现在请看下面requestPermission()方法的代码:

private void requestPermission() {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{INTERNET, CAMERA, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE}, 1);
    }

现在最后一个方法是 onRequestPermissionsResult()。在这种方法中,您可以看到权限是 GRANTED 还是 DENY:

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

        switch (requestCode) {

            case 1:
                if (grantResults.length > 0) {
                    boolean internet = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    boolean camera = grantResults[1] == PackageManager.PERMISSION_GRANTED;
                    boolean readStorage = grantResults[2] == PackageManager.PERMISSION_GRANTED;
                    boolean writeStorage = grantResults[3] == PackageManager.PERMISSION_GRANTED;

                    if (internet && camera && readStorage && writeStorage) {
                        init();
                       // Permission GRANTED (Here write your code what you want).
                    } else {
                        // Permission DENY (If user click on DENY then finish the activity);
                        finish();
                    }
                }
        }
    }

你已经完成了 checkPermission 和 requestPermission。

注意:

以上代码适用于 Activity。片段有细微的变化。

如果我在片段中使用此代码,那么我应该改变什么:

你只想改成requestPermission()方法:

private void requestPermission() {
            requestPermissions(new String[]{INTERNET, CAMERA, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE}, 1);
        }

【讨论】:

  • 也许你认为这很容易,但对我来说这似乎是个坏方法。第一个 checkPermission 将是错误的,即使只授予一个权限并且您不知道它是哪个权限。另一件事是我们不应该在不需要时请求许可,也许用户不想使用应用程序的相机功能但想使用其他功能。在这种情况下,这种方法将阻止用户使用该应用程序
【解决方案2】:

请尝试简化依赖

步骤:1

 dependencies{
   implementation 'com.karumi:dexter:6.0.2'
 }

步数:2

     Dexter.withActivity(this)
    .withPermission(Manifest.permission.CAMERA)
    .withListener(new PermissionListener() {
    @Override public void onPermissionGranted(PermissionGrantedResponse response) {/* 
    @Override public void onPermissionDenied(PermissionDeniedResponse response) {/* 
    @Override public void onPermissionRationaleShouldBeShown(PermissionRequest 
    permission, PermissionToken token) {/* ... */}
    }).check();

链接: https://github.com/Karumi/Dexter

【讨论】:

    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2017-06-19
    • 2016-09-18
    相关资源
    最近更新 更多