7

我一直在使用系统保存截图的方式将我的位图保存到磁盘和图库中。这适用于 Android 4.2 及之前的版本,但不适用于 Android 4.3。

相关代码:

Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
OutputStream out = resolver.openOutputStream(uri);

完整代码在这里

然而,在 4.3(新的 Nexus 7)中,我在第二行得到了FileNotFoundException 。我在网站上看不到 4.3 中与此相关的任何更改。

那么将图像保存到磁盘和图库的正确方法是什么?

已验证:

  • 存储是用这种方法挂载的
  • imageUri 不为空(通常类似于“content://media/external/images/media/2034”)
  • manifest 有权限 android.permission.WRITE_EXTERNAL_STORAGE
4

4 回答 4

1

这是我保存bitmaps画廊的方式:

Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri; //instantiate Uri with location of image
mediaScanIntent.setData(contentUri);
context.sendBroadcast(mediaScanIntent);
于 2013-08-06T17:41:51.377 回答
0

在您的清单文件中尝试将目标 sdk 更改为 18.-

  <uses-sdk android:minSdkVersion="7" 
    android:targetSdkVersion="18"/>

它可能会解决您的问题(可能不会)。在4.3 JELLY_BEAN_MR2中,android 做了一些更改,并且 android 清楚地写道,您的应用程序可能在受限配置文件环境中行为不端。所以请看http://developer.android.com/about/versions/android-4.3.html

于 2013-08-04T11:15:13.947 回答
0

我的清单中有这些许可。

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

但我使用的是目标 SDK 版本 15。是否要求您必须使用目标 SDK 18?

顺便提一句:

以下是从 Facebook 下载个人资料图片的示例代码:

private class DownloadProfilePicTask extends AsyncTask<Void,String,String> {
    Bitmap profilePic;
    String fileName;
    String id;
    String type;
    URL img_value;
    public DownloadProfilePicTask(String i,String ty)
    {
        id = i;
        if(id==null)
        {
            //Log.v("Id is null", "Error");
        }
        //Log.v("Download Profile Pic Task initialized for id:",id);
        type = ty;
    }
    @Override
    protected String doInBackground(Void...param) {
         String root = Environment.getExternalStorageDirectory().toString();
         if(root==null)
         {
             return null;
         }
         try{
         profilePic = BitmapFactory.decodeStream(img_value.openConnection().getInputStream());
         }
         catch (IOException e) {
             e.printStackTrace();

         }

        if(profilePic == null)
        {
            //Log.v("profilePic is null", "Error");
        }
         //Log.v("Root for saving images",root );
         File myDir = new File(root + "/saved_images");
         myDir.mkdirs();
        fileName = root + "/saved_images/" + id + ".png";
        //Log.v("filename is ",fileName);
         File file = new File (fileName); 
         fileName = file.getPath();
         if (file.exists ()) file.delete (); 
         try {
                FileOutputStream out = new FileOutputStream(file);
                profilePic.compress(Bitmap.CompressFormat.PNG, 90, out);
                out.flush();
                out.close();
         } catch (Exception e) {
                e.printStackTrace();
         }
         return id;
    }
    @Override
    protected void onPreExecute()
    {
        try
        {
            img_value = new URL("http://graph.facebook.com/"+id+"/picture?type=" + type);
        }
         catch (MalformedURLException e) {
                e.printStackTrace();

        } 

    }
    @Override
    protected void onPostExecute(String result) {
    }
}

然后我就打电话:

new DownloadProfilePicTask(id,type).execute();

下载并自动保存图像。

注意:您将不得不稍微使用 filePath 来确定确切的位置。

于 2013-08-07T07:11:10.420 回答
0

Android 4.3 上的文件系统有一些变化,开始避免开发。直接写入“/sdcard”或“/mnt/sdcard”但使用android ExternalStorage系统。(http://source.android.com/devices/tech/storage/index.html

注意:ExternalStorage 可以是内部存储器:p

对于您的情况,您是否尝试过使用基于的方法getExternalStorage?(像这样:查找外部 SD 卡位置

于 2013-08-07T14:24:07.787 回答