簡體   English   中英

Android從ID獲取Media.Images Uri

[英]Android get Media.Images Uri from ID

我是Android和Java的新手,本周我一直在做一個自學成才的速成課程。 到目前為止,我所學到的並不是太復雜,因為我已經建立了多年的編碼經驗。 所以,背景歷史不在我的問題上。

下面的代碼是我編寫的兩個函數,用於從數據庫中獲取圖像ID並解析正確的Uri,然后我可以使用它將照片上傳到網站。 所以,如果我正在做一個糟糕的工作,或者我正在朝着正確的方向前進,或者即使有更好的/本地的方式來做我需要的事情,那么你們可以親切地看看我的代碼並讓我知道。

另請注意:以下代碼確實有效。 我只是不知道這是否是正確的方法。

謝謝!

// Usage Map idPath = ImageIdPathFetcher.getRealIdPathFromID(getApplicationContext(), Integer.valueOf(image_id));

    public static Map getRealIdPathFromID(Context context, Integer id) {
        Map<String,String> idPath = new HashMap<String, String>();

        Uri external_images_uri = MediaStore.Images.Media.getContentUri("external");
        Uri internal_images_uri = MediaStore.Images.Media.getContentUri("internal");

        // initialize uri
        Uri uri = external_images_uri;

        String ext_img_uri = external_images_uri.toString()+"/"+id;
        String int_img_uri = internal_images_uri.toString()+"/"+id;

        if(check_uri(context, ext_img_uri))
        {
            uri = Uri.parse(ext_img_uri);
        }else if(check_uri(context, int_img_uri))
        {
            uri = Uri.parse(int_img_uri);
        }else {
            idPath.put("id", "");
            idPath.put("path", "");
            return idPath;
        }

        String[] proj       = { Media.DATA, Media._ID };
        Cursor cursor       = context.getContentResolver().query(uri, proj, null, null, null);
        int column_index    = cursor.getColumnIndexOrThrow(Media.DATA);
        cursor.moveToFirst();
        String filepath = cursor.getString(column_index);
        idPath.put("id",   id.toString());
        idPath.put("path", filepath);
        return idPath;
    }

    public static boolean check_uri(Context context, String uri)
    {
        try{
            ContentResolver cr = context.getContentResolver();
            String[] projection = {MediaStore.MediaColumns.DATA};
            Cursor cur = cr.query(Uri.parse(uri), projection, null, null, null);
            if(cur != null)
            {
                cur.moveToFirst();
                String filePath = cur.getString(0);
                if(! new File(filePath).exists()){
                    return false;
                }
            } else {
                return false;
            }
        } catch (Exception e)
        {
            return false;
        }
        return true;
    }

這就是我使用的

public static Uri getImageContentUri(Context context, File imageFile) {
    String filePath = imageFile.getAbsolutePath();
    Cursor cursor = context.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            new String[]{MediaStore.Images.Media._ID},
            MediaStore.Images.Media.DATA + "=? ",
            new String[]{filePath}, null);
    if (cursor != null) {
        try {
            if (cursor.moveToFirst()) {
                int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
                return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(id));
            }
        } finally {
            cursor.close();
        }
    }
    cursor = context.getContentResolver().query(
            MediaStore.Images.Media.INTERNAL_CONTENT_URI,
            new String[]{MediaStore.Images.Media._ID},
            MediaStore.Images.Media.DATA + "=? ",
            new String[]{filePath}, null);
    if (cursor != null) {
        try {
            if (cursor.moveToFirst()) {
                int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
                return Uri.withAppendedPath(MediaStore.Images.Media.INTERNAL_CONTENT_URI, String.valueOf(id));
            }
        } finally {
            cursor.close();
        }
    }
    return null;
}

也可以使用MergeCursor查詢內部和外部MediaStore數據庫:

String myIdImgStr = "123"; // the unique ID of the image in the MediaStore
ContentResolver contentResolver = this.getContext().getContentResolver();
String [] proj = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };

MergeCursor cursor = new MergeCursor(new Cursor[] {
  MediaStore.Images.Media.query(contentResolver,
    Uri.parse(MediaStore.Images.Media.INTERNAL_CONTENT_URI + "/" + myIdImgStr),
    proj),
  MediaStore.Images.Media.query(contentResolver,
    Uri.parse(MediaStore.Images.Media.EXTERNAL_CONTENT_URI + "/" + myIdImgStr),
    proj)
});

if(cursor.getCount() == 1) {
  cursor.moveToFirst();
  String filepath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM