当前位置: 首页 > 知识库问答 >
问题:

Android运行时权限问题

平山
2023-03-14

假设我试图将位图图像保存为png

public void save() {
  String filename = "file.png";
        File sd = Environment.getExternalStorageDirectory();
        File dest = new File(sd, filename);

        try {

            FileOutputStream out = new FileOutputStream(dest);
            fBitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
}

如果我使用Android 6.0及以上版本,我需要请求运行时权限

void validatePermissions() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

            } else {

                ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);

            }

        }
  }

我有几个问题:

上面的代码成功地请求了权限,但是我不得不重新启动应用程序,我如何恰当地暂停代码直到权限被授予或未被授予?

在 Android 6.0 下方,权限由清单文件在安装时授予。Android 5 或更低版本如何处理运行时权限代码?

谢谢

共有3个答案

宋建柏
2023-03-14

您可以使用Dexter库以获得更好的性能。我在这里也分享了Dexter代码

使用Dexter,您需要在应用程序中添加<code>Dexterdependency<code>。构建gradle文件。

implementation 'com.karumi:dexter:6.2.2'

Single permission/////
Dexter.withContext(activity)
            .withPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .withListener(object : PermissionListener {
                override fun onPermissionGranted(p0: PermissionGrantedResponse?) {
                    downloadImage(url)
                }

                override fun onPermissionDenied(p0: PermissionDeniedResponse?) {
                    if (p0!!.isPermanentlyDenied) {
                        showSettingsDialog()
                    }
                }

                override fun onPermissionRationaleShouldBeShown(
                        p0: PermissionRequest?, p1: PermissionToken?
                ) {
                    p1!!.continuePermissionRequest()
                }

            })
            .onSameThread()
            .check()


Multiple Permission////

Dexter.withContext(requireContext())
            .withPermissions(Manifest.permission.RECORD_AUDIO,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.READ_EXTERNAL_STORAGE)
            .withListener(object : MultiplePermissionsListener {
                override fun onPermissionsChecked(p0: MultiplePermissionsReport?) {
                    if (p0!!.areAllPermissionsGranted())
                    {
                        
                        
                    }else if (p0.isAnyPermissionPermanentlyDenied)
                    {
                        openSettings()
                    }
                }

                override fun onPermissionRationaleShouldBeShown(p0: MutableList<PermissionRequest>?, permissionToken: PermissionToken?) {
                    permissionToken?.continuePermissionRequest()
                }
            }).check()
堵德曜
2023-03-14

上面的代码成功地请求了权限,但是我不得不重新启动应用程序,我如何恰当地暂停代码直到权限被授予或未被授予?

你可以利用这个空虚

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.          
            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

从这个答案

在Android 6.0以下,清单文件在安装时授予权限。如何

Android 5或更低版本处理运行时权限代码?

代码将被跳过

庄嘉
2023-03-14

你不应该重启应用程序。你应该改变你的应用程序的逻辑:当用户授予权限时等待,并尝试第二次运行一个操作。是的,你可以为此使用第三方库。比如我个人选择:权限调度员。

 类似资料:
  • 我添加了使用权限,包括WRITE_EXTERNAL_STORAGE,android.permission.相机,READ_EXTERNAL_STORAGEAndroidManifest.xml. 当我在Nexus6(API 24)中运行我的应用程序时,它向我抛出了以下错误: java.io.IOException:权限被拒绝 这是我的代码: 如何在权限相机运行时打开之前使用它?

  • 我有关于Android 6(Marshmallow)运行时权限的问题。如果用户想从图库中挑选一张照片,我们是否应该要求权限? 似乎我可以访问画廊,即使我关闭了存储权限。

  • 问题内容: Android开发人员文档提供了以下在运行时请求权限的示例: 在此示例中,什么是“ MY_PERMISSIONS_REQUEST_READ_CONTACTS”?它说这是一个应用程序定义的int常量,但这是否意味着我应该制作一个Constants.java并声明一个公共静态int?该值是多少? 在其他示例中,我看到人们在这里使用1,或者0或0xFFEEDDCC,但是我找不到它的解释。有人

  • 我是android的新手,不知道我做错了什么,这个类得到了经度和纬度并发送到另一个类,代码抛出了一个错误请告诉我该怎么做怎么做: public void onRequestPermissionsResult出错(int requestCode,String[]permissions,int[]grantResults

  • 首先,我知道这是一个重复的问题,但我已经看过了其他类似问题的答案,没有找到成功的解决方案。 我已经开发了一款应用程序,可以在我的测试设备上完美运行,这是一款运行Android L(5.0.1)的三星S4。不过,我希望这款应用程序也能在较新版本的Android上运行。 我知道Android M的请求权限已更改,因此必须在运行时请求权限,但当我尝试实现此功能时,对话框从未出现,因此从未请求所需的权限。

  • Android开发人员文档给出了运行时请求权限的示例: 此示例中的“MY_PERMISSIONS_REQUEST_READ_CONTACTS”是什么?它说它是一个应用程序定义的int常量,但这是否意味着我应该做一个常量.java并声明一个公共静态int?值应该是多少? 在其他例子中,我看到人们在这里使用1,或0或0xFFEEDDCC,但我找不到它是什么的解释。谁能给我解释一下这里需要什么,为什么?