从URI中检索位图

19

我已经添加了“通过我的应用程序分享”的选项。我在接收活动类中插入了以下代码。

    // Get the intent that started this activity
    Intent intent = getIntent();
    Uri data = intent.getData();

    // Figure out what to do based on the intent type
    if (intent.getType().indexOf("image/") != -1) {
        // Handle intents with image data ...
}

如何获取位图图像的下一步操作。

8个回答

40

既然您已经获得了Uri,现在您需要将该Uri传递给getBitmap()以获取位图并使用该位图。

Uri imageUri = intent.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),imageUri);
Imageview my_img_view = (Imageview ) findViewById (R.id.my_img_view);
my_img_view.setImageBitmap(bitmap);

4
很抱歉,它会对我返回FileNotFoundException。 - Kimmi Dhingra

9
从URI获取位图的方法如下:
Bitmap  mBitmap = Media.getBitmap(this.getContentResolver(), uri);

希望这能对您有所帮助。

8
请记得从非主线程(后台线程)调用此函数。 - Magnus
1
@nikvs,getBitmap() 方法目前已经过时。 - Sakhawat Hossain

3
Retrive bitmap from uri.....

public static Bitmap decodeUriToBitmap(Context mContext, Uri sendUri) {
        Bitmap getBitmap = null;
        try {
            InputStream image_stream;
            try {
                image_stream = mContext.getContentResolver().openInputStream(sendUri);
                getBitmap = BitmapFactory.decodeStream(image_stream);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return getBitmap;
    }

哪些异常可能会发生? - CoolMind
不需要尝试任何东西 - Chisko

1

这对我来说是工作

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
    Uri imageUri = data.getData();
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
}
}

它在主线程中运行。同时编译器警告可能会发生IOException。 - CoolMind

0

参考Android开发者文档,您可以使用此方法从URI获取位图

    ....

    Uri uri = intent.getData();
    try {
        Bitmap bitmap = getBitmapFromUri(uri);
        // do something with this bitmap

    } catch (IOException e) {
        e.printStackTrace();
    }
}


private Bitmap getBitmapFromUri(Uri uri) throws IOException {
    ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
    FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
    Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
    parcelFileDescriptor.close();
    return image;
}

0

一旦您拥有了Uri,您可以使用类似以下的代码:

fun getBitmapFromUri(context: Context, uri: Uri): Bitmap? {
        
        var parcelFileDescriptor: ParcelFileDescriptor? = null
        return try {
            parcelFileDescriptor = context.contentResolver.openFileDescriptor(uri, "r")
            val fileDescriptor: FileDescriptor? = parcelFileDescriptor?.fileDescriptor
            val image = BitmapFactory.decodeFileDescriptor(fileDescriptor)
            parcelFileDescriptor?.close()
            image
        } catch (e: Exception) {
            //Log.e(TAG, "Failed to load image.", e)
            null
        } finally {
            try {
                parcelFileDescriptor?.close()
            } catch (e: IOException) {
                e.printStackTrace()
                //Log.e(TAG, "Error closing ParcelFile Descriptor")
            }
        }
    }

0
你可以试试这个。在onActivityResult方法中调用setPic()。我曾在一个应用程序中使用过它来拍照并将其放入ImageView中。
private void setPic() {

    //currentPhotoPath contains path of image file.
    //visorFoto is a reference to an ImageView object.
    File file = new File(currentPhotoPath);
    Uri imageUri = Uri.fromFile(file);
    visorFoto.setImageURI(imageUri);

}

-5
请使用这个链接。
这就是你要找的内容 如何从Uri获取位图? 尝试一下,它对我有效:
public static Bitmap getBitmapFromURL(String src) {
        try {
            System.out.printf("src", src);
            URL url = new URL(src);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            System.out.printf("Bitmap", "returned");
            myBitmap = Bitmap.createScaledBitmap(myBitmap, 100, 100, false);//This is only if u want to set the image size.
            return myBitmap;
        } catch (IOException e) {
            e.printStackTrace();
            System.out.printf("Exception", e.getMessage());
            return null;
        }

仍然尝试从Url获取,它的URI @nikvs有最干净的解决方案(使用MediaStore类中的getBitmap帮助方法) - Magnus

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