android - 无法在外部存储上保存文件,即使有用户权限 [Android]

标签 android android-intent android-bitmap

我正在开发一个用于在 Android 上处理图像的应用程序,但我一直在编写图像保存代码。

这是我使用的方法:

private void saveImageToExternalStorage(Bitmap finalBitmap) {
    String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
    File myDir = new File(root + "/saved_images");
    myDir.mkdirs();
    Random generator = new Random();
    int n = 10000;
    n = generator.nextInt(n);
    String fname = "Image-" + n + ".jpg";
    File file = new File(myDir, fname);
    if (file.exists())
        file.delete();
    try {
        FileOutputStream out = new FileOutputStream(file);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }


    // Tell the media scanner about the new file so that it is
    // immediately available to the user.
    MediaScannerConnection.scanFile(this, new String[]{file.toString()}, null,
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });

}

每次我执行这个,FileOutputStream 都会给出一个 FileNotFoundException。

我的 list :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gabrielerestuccia.testimmagini">

<application
    ...
</application>

<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

</manifest>

我正在 Linux 上的 Android Studio 1.5.1 上开发这个,使用内置的虚拟 Nexus 5 和 Android 6.0。

感谢您的帮助。

最佳答案

我在 Android 6 上遇到了同样的问题。这是因为新的权限模型。

您可以通过以下代码动态检查您是否具有权限:

private static boolean canWriteToExternalStorage(Context context) {
    return ContextCompat.checkSelfPermission(context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}

您还可以通过转到“设置”->“应用”->“您的应用”->“应用权限”并打开“存储”项来为您的应用启用写入权限。

为了向您的用户请求此权限,您应该在您的 Activity 中添加这段代码:

public void onCreate(Bundle savedInstanceState) {
    ...
    checkWritingPermission();
}

@Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == REQUEST_CODE_PERMISSION) {
      if (grantResults.length >= 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // permission was granted
      } else {
        // permission wasn't granted
      }
    }
  }

  private void checkWritingPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        // permission wasn't granted
      } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION);
      }
    }
  }

关于android - 无法在外部存储上保存文件,即使有用户权限 [Android],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35826015/

相关文章:

Android DrawBitmap 在 DIP 中?

android - 广播接收器未通过服务接收 Intent

android - 将数据从一个 Activity 传递到另一个 Activity 会导致强制关闭

java - Android - 从最近的应用程序刷应用程序时服务停止

android - 使用 picasso : out of memory exception 从 firebase 存储下载图像

android - TCP 服务器接收数据的速度比发送数据的速度慢

android - 改造 API 调用收到 "HTTP FAILED: java.io.IOException: Canceled"

android - MediaStyle LargeIcon 的大小

android - 如何在不使用 ImageView 的情况下使用 Picasso 加载位图?

java - 简单的 XML 解析 XML 到列表