Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓6.0+;java.io.FileNotFoundException:(权限被拒绝)_Android_Permissions_Android Manifest_Android 6.0 Marshmallow - Fatal编程技术网

Android 安卓6.0+;java.io.FileNotFoundException:(权限被拒绝)

Android 安卓6.0+;java.io.FileNotFoundException:(权限被拒绝),android,permissions,android-manifest,android-6.0-marshmallow,Android,Permissions,Android Manifest,Android 6.0 Marshmallow,最近,我遇到了一个关于权限问题的非常奇怪的问题,这让我困惑了几天,我希望有人能帮我弄清楚到底发生了什么。谢谢 问题是: 出于某种原因,我需要应用存储权限来保存一些照片,并且我已将该权限添加到AndroidManifestival.xml: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permis

最近,我遇到了一个关于权限问题的非常奇怪的问题,这让我困惑了几天,我希望有人能帮我弄清楚到底发生了什么。谢谢

问题是: 出于某种原因,我需要应用存储权限来保存一些照片,并且我已将该权限添加到
AndroidManifestival.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在保存照片之前,我已经使用了这个方法,权限对话框已经出现,我已经检查过了。我已经在应用程序设置中检查了应用程序权限,没有问题

下面是我用来将位图保存到文件的方法:

public static String savePhotoToSDCard(Bitmap bitmap, String photoName) {
    String absolutePath = "";

    String state = Environment.getExternalStorageState();
    Log.e("file", "---------------------" + state);
    File newsDir =  new File(Environment.getExternalStorageDirectory().toString()
            + File.separator + "photo");


    if (!newsDir.exists()) {
        newsDir.mkdirs();
    }

    File picFile = new File(newsDir, photoName + ".png");
    absolutePath = picFile.getAbsolutePath();

    if (picFile.exists()) {
        picFile.delete();
    }

    if (photoName.equals("avatar")) {          
        int ratio = 2;        
        Bitmap result = Bitmap.createBitmap(bitmap.getWidth() / ratio, bitmap.getHeight() / ratio, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        Rect rect = new Rect(0, 0, bitmap.getWidth() / ratio, bitmap.getHeight() / ratio);
        canvas.drawBitmap(bitmap, null, rect, null);
    }

    try {
        FileOutputStream fileOutputStream = new FileOutputStream(picFile);
        if (bitmap != null) {

            if (bitmap.compress(Bitmap.CompressFormat.PNG, 30, fileOutputStream)) {
                fileOutputStream.flush();
                Log.d("Photo", "---------------------------fileOutputStream.flush");
                fileOutputStream.close();
            }
        }
    } catch (FileNotFoundException e) {
        Log.e("File", "----------------------------" + e.toString());
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return absolutePath;
}
当我运行应用程序时,它出错了,下面是日志:

java.io.FileNotFoundException:/storage/emulated/photo/avatar.png(权限被拒绝)

但最奇怪的是,当我两次向AndroidManifestival.xml添加存储权限时,它成功了

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

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


那么,有什么问题?请帮忙。

我认为解决方案与类似

有吗

与这些链接相关,您必须在代码中正确实施这些步骤:

首先:尝试使用此命令请求权限:

public static boolean isGrantExternalRW(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && (context.checkSelfPermission(
            Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {

        ((Activity)context).requestPermissions(new String[]{
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        }, Constants.PERMISSION_REQUEST_CODE);

        return false;
    }

    return true;
}
 boolean permissionGranted = ActivityCompat.checkSelfPermission(this, Manifest.permission......) == PackageManager.PERMISSION_GRANTED;
    if(permissionGranted) {
        // {Some Code}
    } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission....}, 200);
    }
Second:OnRequestPermissionsResultCallback的实现

...implements  ActivityCompat.OnRequestPermissionsResultCallback {
Third:覆盖
onRequestPermissionsResult
方法

 @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 200: {
                if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // {Some Code}
                }
            }
        }
    }

在启动屏幕或打开相机的位置调用此方法

 public static boolean checkAndRequestPermissions(Context context) {
                int cameraPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
                int readfilePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
                int writefilePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
                if (cameraPermission != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.CAMERA);
                }
                        if (readfilePermission != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
                }
                if (writefilePermission != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
                if (!listPermissionsNeeded.isEmpty()) {
                    ActivityCompat.requestPermissions((Activity) context, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
                    return false;
                }
                return true;
            }
在AndroidManifestival.xml中,您需要添加

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

你能这样试试吗,我想你一创建文件就删除了它

if (new File(newsDir, photoName + ".png").exists()) {
       new File(newsDir, photoName + ".png").delete();
}
File picFile = new File(newsDir, photoName + ".png");
absolutePath = picFile.getAbsolutePath();
代替

Environment.getexternalstoragedirectory().toString()
use this 
Environment.getexternalstoragedirectory().getabsolutepath()

幸运的是,我终于解决了我的问题。原因如下: 存储权限与以下依赖项冲突:

compile 'com.github.vungle:vungle-android-sdk:5.3.0'

当我添加依赖项时,系统无法识别我申请的存储权限(虽然我在AndroidManifest.xml中添加了两次,但成功了),但当我删除它时,一切都正常!此依赖项用于将广告添加到应用程序中,但现在我不得不放弃它。

请删除第一组权限,然后重试,看看是否再次出现相同的问题
FileNotFoundException:/storage/emulated/0/android/mktaid/avatar.png
?如果您使用发布的代码,那么这不是一个可能的路径。因为它不匹配
File newsDir=new文件(Environment.getExternalStorageDirectory().toString()+File.separator+“photo”)
。此外,像
/storage/emulated/0/android/…
这样的路径不可能存在,因为已经有
/storage/emulated/0/android
目录。我已删除了第一组权限,但问题再次出现。我之前输入了错误的日志,现在我已更正,而此链接可能会回答问题,最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-@Grimthorr您能检查最后一次编辑吗?给我一个反馈,没有必要实现onRequestPermissionResult()。结果是肯定的还是否定的。如果您添加该函数,则独立于。OP说在“设置”中,开关是打开的。所以我不明白你竟然开始谈论权限。@Grimthorr:轮到我了,我要感谢你的支持@HadjKhelilNawrez编辑后的答案要好得多。但是,我认为它也被标记了,因为内容与问题不太匹配。这就是为什么只有链接的答案通常更适合作为评论,直到你确定这个问题可以从链接中的信息中得到答案。是的,我还集成了vungle库,它可以工作。奇怪的问题