当前位置: 首页 > 知识库问答 >
问题:

在Android 4.3中将位图保存到磁盘/图库

符鸣
2023-03-14

我一直在使用系统保存截图的方式将位图保存到磁盘和图库中。这在Android4.2及之前版本中有效,但在Android3.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 不为 null(通常类似于 “content://media/external/images/media/2034”)
  • 清单具有权限android.permission.WRITE_EXTERNAL_STORAGE

共有3个答案

宋建柏
2023-03-14

我在我的清单中有这些许可。

<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();

下载并自动保存图像。

注意:您必须稍微使用文件路径才能获得确切的位置。

公孙俭
2023-03-14

在清单文件中,尝试将目标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

荆运诚
2023-03-14

这是我将<code>位图

Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri; //instantiate Uri with location of image
mediaScanIntent.setData(contentUri);
context.sendBroadcast(mediaScanIntent);
 类似资料:
  • 问题内容: 我的Express应用程序正在从浏览器中接收base64编码的PNG(使用toDataURL()从画布生成)并将其写入文件。但是该文件不是有效的图像文件,因此“文件”实用程序只是将其标识为“数据”。 问题答案: 我认为您正在转换的数据比您需要的更多。一旦使用正确的编码创建了缓冲区,您只需要将缓冲区写入文件即可。 new Buffer(…,’base64’)通过将输入解释为base64编

  • 下面的代码在内存中创建了一个文件。 我想把那个pdf文件保存在磁盘上以便查看。我将如何在python中实现它?

  • 我创建了一个简单的应用程序,裁剪图像。现在我想保存这个图像到消防基地。 如何将此图像保存到Firebase。我尝试了很多教程,但都没有成功。请用简单的代码验证。

  • 问题内容: 我有一个小的PyGI项目,它使用开罗图像表面,然后使用表面图案缩放并在Gtk.DrawingArea上进行渲染。 我想将 缩放后的 版本写入PNG文件。我尝试使用Surface.write_to_png()从原始表面进行写操作,但是它仅以原始(即非缩放)大小进行写操作,因此我被困在那里。 然后我想我也许可以从Gtk.DrawingArea中获取渲染的图像并将其写入磁盘,但是我还没有找到

  • 问题内容: 我正在显示一组图像,然后,如果用户希望,可以将图像保存到SD卡。我需要将其保存到外部存储的帮助。有人可以帮我这个忙吗? 网格视图: ImageAdapter: 问题答案: 嗨,我还没有使用过作为应用程序一部分提供的代码,但是我确实使用它来调试了其中一个应用程序在运行时生成的位图。 使用此代码,只要您有位图,就只需要此+清单权限 希望能帮到您 杰森

  • 我试图使用以下命令保存png图像: 我的png文件在绘图的边界框周围到处都有棋盘格图案。在框内我可以看到字段,但棋盘格图案覆盖了轴标记、轴标签、打印标题等。 我创建的文件与此链接处的第三个图像非常相似。唯一的区别是,在那里你到处都可以看到棋盘。 问题:如何在没有这种棋盘格图案的情况下保存png图像?