有没有一种方法可以获取位图的URI而无需将其保存到SD卡上?

25
我正在制作一个应用程序,允许用户使用Android Intent共享图像,但如何获取位图的URI而无需将其保存到SD卡中?
我已经使用了这段代码,它可以正常工作,但我不需要将此位图保存到SD卡中。
private Uri getImageUri(Context inContext, Bitmap inImage) {
          ByteArrayOutputStream bytes = new ByteArrayOutputStream();
          inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
          String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "title", null);
          return Uri.parse(path);
    }

我需要获取那个URI,但不想将位图保存到SD卡


你的意思是“你想获取内存中位图的Uri”吗? - Sagar Pilkhwal
@Sagar Pilkhwal 我想获取位图的URI以便分享,但我不需要将其保存到内部或外部存储器中...这可能吗? - Ahmed Mousa
不,这是不可能的。你必须先将文件保存到SD卡上,然后分享它,最后再删除该文件。 - Sagar Pilkhwal
@Sagar Pilkhwal,我什么时候可以知道用户是否已经分享了图片,以便在处理完成后将其删除? - Ahmed Mousa
我已经发布了一个答案,请尝试。 - Sagar Pilkhwal
3个回答

21

试试这个:

protected void ShareImage(Intent intent) {
    try {
        URL url = new URL(mImageUrl);
        Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
        intent.putExtra(Intent.EXTRA_STREAM, getImageUri(mActivity, image));
    } catch (Exception e) {
        e.printStackTrace();
    }
    startActivityForResult(Intent.createChooser(intent, 1001));
}

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

public void onActivityResult(int requestCode, int resultCode, Intent data){
    //check for result is OK and then check for your requestCode(1001) and then delete the file

}

1
是的,这就是我需要的,谢谢你...我不知道为什么这个方法从我的脑海中消失了:D..再次感谢。 - Ahmed Mousa
1
现在你将会从此记住它... :) - Sagar Pilkhwal
4
你完全忘记了你正在创建的字节数组。这怎么可能奏效? - Mikaël Mayer
@NullByte08,你能找到一个创建临时图像或之后删除它的解决方案吗? - Red M
@RedM 我已经回答了,请检查是否有帮助。这是很久以前的事情,所以我不记得实际问题是什么了。 - NullByte08
显示剩余3条评论

2
尝试这种方法。
protected void tryToShareImage(Intent intent) {
    try {
        URL url = new URL(mImageUrl);
        Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
        intent.putExtra(Intent.EXTRA_STREAM, getImageUri(mActivity, image));
    } catch (Exception e) {
        e.printStackTrace();
    }
    startActivity(Intent.createChooser(intent, "Share using..."));
}

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

在此之后,您可以使用File.delete()删除文件。


我不知道何时可以删除这个文件,如果我在启动意图后删除文件,URI 就找不到了。当用户选择共享时,我也不知道。 - Ahmed Mousa
1
当文件上传成功后,您可以删除文件。如果您正在使用AsyncTask,则可以在onPostExecute中删除。 - Derek

-1

已接受的答案对我不起作用。也许我错过了一些东西。但是,每次我获取位图的URI时,它都保存在本地存储中。我找不到删除已接受答案中(额外)保存的位图的方法。

我正在使用以下方式:

首先,获取位图的URI:

public static Uri getUri(Context context, Bitmap bitmap) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, "Title", null);
        return Uri.parse(path);
    }

然后,删除(多余的)保存的位图:

this.getContentResolver().delete(uri, null, null);

PS:上面的删除代码是针对Activity的。如果你想在Fragment中进行删除,请使用以下代码:

getActivity().getContentResolver().delete(uri, null, null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接