【问题标题】:Permission denied for opening a screen shot I created打开我创建的屏幕截图的权限被拒绝
【发布时间】: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


    【解决方案1】:

    您好,您假设 sdcard 始终是 /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" />
    

    【讨论】:

    • 是的,我收到一个弹出窗口“允许 ScreenshotApp 访问您设备上的照片、媒体和文件?我不确定 atm 是否检查这两个权限。关于您的建议,我得到:E /BitmapFactory:无法解码流:java.io.FileNotFoundException:/storage/emulated/0/screencaps/1515070630835.png:打开失败:ENOENT(没有这样的文件或目录)这没有 File.exists() 检查,因为它可以找不到
    • 奇怪?没有目录吗?你做了目录吗? 0 应该是 SD 卡?
    • 是的,它就在那里。如果我转到 Windows 资源管理器,我可以看到目录和屏幕截图。
    • 我唯一能想到的是你的应用程序将文件保存为“ss”+毫秒,而你只需要毫秒
    • 你说得对,我忘了添加 ss 部分,现在我得到了:E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/screencaps/ss1515076505310. png:打开失败:EACCES(权限被拒绝)它必须是具有权限的东西然后可能......
    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 2013-03-13
    • 2021-08-23
    • 2020-05-31
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多