android - एंड्रॉइड में फ़ाइल पथ से सामग्री यूरी प्राप्त करें




image (6)

मुझे एक छवि का पूर्ण पथ पता है (उदाहरण के लिए, /sdcard/cats.jpg के लिए कहें)। इस फ़ाइल के लिए सामग्री यूरी के लिए कोई रास्ता है?

असल में मेरे कोड में मैं एक छवि डाउनलोड करता हूं और इसे किसी विशेष स्थान पर सहेजता हूं। छवि को एक छवि दृश्य में सेट करने के लिए वर्तमान में मैं पथ का उपयोग कर फ़ाइल खोलता हूं, बाइट प्राप्त करता हूं और बिटमैप बनाता हूं और फिर ImageView में बिटमैप सेट करता हूं। यह एक बहुत ही धीमी प्रक्रिया है, इसके बजाय अगर मैं सामग्री यूरी प्राप्त कर सकता हूं तो मैं आसानी से विधि का उपयोग कर सकता हूं ImageView.setImageUri(uri)


// यह कोड 2.2 पर छवियों के लिए काम करता है, सुनिश्चित नहीं है कि कोई अन्य मीडिया प्रकार है या नहीं

   //Your file path - Example here is "/sdcard/cats.jpg"
   final String filePathThis = imagePaths.get(position).toString();

   MediaScannerConnectionClient mediaScannerClient = new
   MediaScannerConnectionClient() {
    private MediaScannerConnection msc = null;
    {
        msc = new MediaScannerConnection(getApplicationContext(), this);
        msc.connect();
    }

    public void onMediaScannerConnected(){
        msc.scanFile(filePathThis, null);
    }


    public void onScanCompleted(String path, Uri uri) {
        //This is where you get your content uri
            Log.d(TAG, uri.toString());
        msc.disconnect();
    }
   };

आप उपयोग के आधार पर इन दो तरीकों का उपयोग कर सकते हैं

Uri uri = Uri.parse("String file location");

या

Uri uri = Uri.fromFile(new File("string file location"));

मैंने दोनों तरीकों और दोनों कामों की कोशिश की है।


किसी भी कोड को लिखने के बिना फ़ाइल आईडी प्राप्त करना, केवल एडीबी खोल सीएलआई आदेशों के साथ:

adb shell content query --uri "content://media/external/video/media" | grep FILE_NAME | grep -Eo " _id=([0-9]+)," | grep -Eo "[0-9]+"

यू कोड स्निपेट के नीचे कोशिश कर सकते हैं

    public Uri getUri(ContentResolver cr, String path){
    Uri mediaUri = MediaStore.Files.getContentUri(VOLUME_NAME);
    Cursor ca = cr.query(mediaUri, new String[] { MediaStore.MediaColumns._ID }, MediaStore.MediaColumns.DATA + "=?", new String[] {path}, null);
    if (ca != null && ca.moveToFirst()) {
        int id = ca.getInt(ca.getColumnIndex(MediaStore.MediaColumns._ID));
        ca.close();
        return  MediaStore.Files.getContentUri(VOLUME_NAME,id);
    }
    ca.close();
    return null;
}

स्वीकार किए गए समाधान शायद आपके उद्देश्यों के लिए सबसे अच्छा शर्त है, लेकिन वास्तव में विषय पंक्ति में प्रश्न का उत्तर देने के लिए:

मेरे ऐप में, मुझे यूआरआई से रास्ता प्राप्त करना होगा और यूआरआई को पथ से प्राप्त करना होगा। भूतपूर्व:

/**
 * Gets the corresponding path to a file from the given content:// URI
 * @param selectedVideoUri The content:// URI to find the file path from
 * @param contentResolver The content resolver to use to perform the query.
 * @return the file path as a string
 */
private String getFilePathFromContentUri(Uri selectedVideoUri,
        ContentResolver contentResolver) {
    String filePath;
    String[] filePathColumn = {MediaColumns.DATA};

    Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    filePath = cursor.getString(columnIndex);
    cursor.close();
    return filePath;
}

उत्तरार्द्ध (जो मैं वीडियो के लिए करता हूं, लेकिन MediaStore.Video के लिए MediaStore.Audio (आदि) को प्रतिस्थापित करके ऑडियो या फ़ाइलें या संग्रहीत सामग्री के अन्य प्रकारों के लिए भी उपयोग किया जा सकता है):

/**
 * Gets the MediaStore video ID of a given file on external storage
 * @param filePath The path (on external storage) of the file to resolve the ID of
 * @param contentResolver The content resolver to use to perform the query.
 * @return the video ID as a long
 */
private long getVideoIdFromFilePath(String filePath,
        ContentResolver contentResolver) {


    long videoId;
    Log.d(TAG,"Loading file " + filePath);

            // This returns us content://media/external/videos/media (or something like that)
            // I pass in "external" because that's the MediaStore's name for the external
            // storage on my device (the other possibility is "internal")
    Uri videosUri = MediaStore.Video.Media.getContentUri("external");

    Log.d(TAG,"videosUri = " + videosUri.toString());

    String[] projection = {MediaStore.Video.VideoColumns._ID};

    // TODO This will break if we have no matching item in the MediaStore.
    Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(projection[0]);
    videoId = cursor.getLong(columnIndex);

    Log.d(TAG,"Video ID is " + videoId);
    cursor.close();
    return videoId;
}

असल में, MediaStore का DATA कॉलम (या जो भी उप-अनुभाग आप पूछताछ कर रहे हैं) फ़ाइल पथ स्टोर करता है, इसलिए आप इसे देखने के लिए उस जानकारी का उपयोग करते हैं।


अद्यतन करें

यहां यह माना जाता है कि आपका मीडिया (छवि / वीडियो) पहले ही सामग्री मीडिया प्रदाता में जोड़ा गया है। यदि नहीं, तो आप सामग्री यूआरएल को सटीक रूप से प्राप्त नहीं कर पाएंगे जो आप चाहते हैं। इसके बजाय फाइल उरी होगी।

मेरे फाइल एक्सप्लोरर गतिविधि के लिए मेरा एक ही सवाल था। आपको पता होना चाहिए कि फाइल के लिए कंटूररी केवल छवि, ऑडियो और वीडियो जैसे मध्यस्थ डेटा का समर्थन करती है। मैं आपको एसडीकार्ड से छवि चुनने से छवि सामग्री uri प्राप्त करने के लिए कोड दे रहा हूं। इस कोड को आजमाएं, शायद यह आपके लिए काम करेगा ...

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 && cursor.moveToFirst()) {
    int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
    cursor.close();
    return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id);
  } else {
    if (imageFile.exists()) {
      ContentValues values = new ContentValues();
      values.put(MediaStore.Images.Media.DATA, filePath);
      return context.getContentResolver().insert(
          MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    } else {
      return null;
    }
  }
}






image