打开我创建的屏幕截图的权限被拒绝



我正在使用有根手机使用shell拍摄屏幕截图,我想打开我拍摄的图像(它在文件资源管理器中可见,并且由于我使用File.exists()检查它而存在)。我要求此权限:

安卓清单.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="package.name.example">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
...

在代码中,我检查是否授予了权限:

主活动.java

//Check permissions
if ((ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED)) {
// permissions already given
} else {
// request permission
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 101);
}

因此,单击按钮,我使用shell拍摄屏幕截图:

long startMiliseconds = System.currentTimeMillis();
Process captureScreen = Runtime.getRuntime().exec("su",null,null);
OutputStream os = captureScreen.getOutputStream();
os.write(("/system/bin/screencap -p "+"/sdcard/screencaps/ss"+ startMiliseconds +".png").getBytes("ASCII"));
os.flush();
os.close();

这将要求我提供超级用户权限并拍摄屏幕的屏幕截图。当我尝试以编程方式访问创建的图像时(我首先检查文件是否存在,它确实存在):

String filePath = "/sdcard/screencaps/ss"+ startMiliseconds +".png";
Bitmap bMap = BitmapFactory.decodeFile(filePath);
img.setImageBitmap(bMap);

(img 是一个图像视图标签)我收到此错误:

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /sdcard/screencaps/ss1515070630835.png: open failed: EACCES (Permission denied)

编辑:似乎与权限有关。我已将最小 SDK 和目标 SDK 更改为 23。 我将权限请求的处理更改为:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 101:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//granted permission
System.out.println("INFO: 1");
} else {
//not granted permission
System.out.println("INFO: 2");
}
if (grantResults.length > 0 && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
//granted permission
System.out.println("INFO: 3");
} else {
//not granted permission
System.out.println("INFO: 4");
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}

即使我在弹出窗口中按允许,我也会收到 INFO:2 和 INFO: 4,这意味着我的权限不被接受。很抱歉没有使用日志记录。

编辑2:似乎问题是我在权限弹出窗口后收到的错误:检测到屏幕覆盖

你好,你假设SD卡总是/sdcard...是的,我知道这听起来很愚蠢。尝试

Environment.getExternalStorageDirectory()+File.separator+"/screencaps/ss"

在小编辑中:

你还没有说你的屏幕上是否出现了一个弹出窗口?那也可能是你的问题。用户必须授予应用权限。

如果是这样,请阅读此内容并查看示例 https://developer.android.com/training/permissions/requesting.html

**编辑:** 这是黑暗中一个巨大的镜头,但这里有一些你可以放在你的获取图像方法中,在那里你可以将图像解析为imageview

galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
startActivityForResult(galleryIntent, PICK_FROM_GALLERY);

设置库意向。或者也许添加

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

最新更新