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

时间:2018-01-04 13:22:28

标签: android permissions screenshot root android-bitmap

我正在使用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: 似乎问题是我在获得权限弹出后得到的错误:检测到屏幕叠加

1 个答案:

答案 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" />