【发布时间】:2018-01-04 13:22:27
【问题描述】:
我正在使用有根手机通过 shell 进行屏幕截图,我想打开我拍摄的图像(它在文件资源管理器中可见并且它存在,因为我使用 File.exists() 进行检查 em>)。我请求了这个权限:
AndroidManifest.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"
...
在代码中我检查是否授予权限:
MainActivity.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 是一个 ImageView 标签)我得到这个错误:
E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /sdcard/screencaps/ss1515070630835.png: open failed: EACCES (Permission denied)
编辑: 似乎它与权限有关。我已将 min SDK 和 target 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: 似乎问题是我在权限弹出后得到的错误:检测到屏幕覆盖
【问题讨论】:
标签: android permissions screenshot root android-bitmap