假设我试图将位图图像保存为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 或更低版本如何处理运行时权限代码?
谢谢
您可以使用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()
上面的代码成功地请求了权限,但是我不得不重新启动应用程序,我如何恰当地暂停代码直到权限被授予或未被授予?
你可以利用这个空虚
@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或更低版本处理运行时权限代码?
代码将被跳过
你不应该重启应用程序。你应该改变你的应用程序的逻辑:当用户授予权限时等待,并尝试第二次运行一个操作。是的,你可以为此使用第三方库。比如我个人选择:权限调度员。
我添加了使用权限,包括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,但我找不到它是什么的解释。谁能给我解释一下这里需要什么,为什么?