我正在使用root手机拍摄使用shell的屏幕截图,我想打开我拍摄的图像(它在文件浏览器中可见,它存在,因为我用 File.exists()检查它)。我问了这个权限:
的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和目标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);
}
}
即使我在弹出窗口中按下Allow,我也会得到INFO:2和INFO:4,这意味着我的权限不被接受。抱歉没有使用登录。
编辑2: 似乎问题是我在获得权限弹出后得到的错误:检测到屏幕叠加
答案 0 :(得分:0)
你好你的假设sdcard总是/ sdcard ...是的我知道这听起来很愚蠢。尝试
Environment.getExternalStorageDirectory()+File.separator+"/screencaps/ss"
小编辑:
您还没有说过屏幕上是否显示弹出窗口?那可能也是你的问题。用户必须提供应用程序权限。
如果是这样,请阅读并查看示例 glyphImage - MKMarkerAnnotationView | Apple Developer Documentation
**编辑:** 这是一个在黑暗中拍摄的巨大镜头,但这里有一些你可以放在你的图像方法中,你将图像解析为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" />