दिलचस्प पोस्ट
मैं $ स्कोप का उपयोग कैसे करूं? $ Watch और $ scope.AngularJS में $ लागू होते हैं? कैसे केवल एकल उद्धरणों से बचने के लिए? किसी एप्लिकेशन से वर्चुअलाइज्ड ओएस खोजें? PHPMailer AddAddress () क्या जावा में एक int.tryparse है जो खराब डेटा के लिए एक अपवाद नहीं फेंकता है? imagebutton के साथ listview पंक्ति पर क्लिक नहीं कर सकते यूआरएल में अजाक्स अनुरोध कैसे दिखाना है? स्ट्रिंग को "" का उपयोग करके कैसे प्रारंभ किया जा सकता है? नया बिटमैप (फ़ाइलपथ) द्वारा नि: शुल्क फ़ाइल लॉक आप जेएसपी में क्लासेस कैसे आयात करते हैं? मैं ServletFilter में ServletResponse से HTTP स्थिति कोड कैसे प्राप्त करूं? क्यूटी 5 में अतिभारित सिग्नल और स्लॉट को कनेक्ट करना मैं Rails activerecord के मॉडल में विशेषताओं के लिए एक डिफ़ॉल्ट मान कैसे बना सकता हूँ? PowerShell में आउटपुट को अनदेखा करने का बेहतर (क्लीनर) तरीका क्या है? टंकिनटर: "पायथन को रुपये के लिए कॉन्फ़िगर नहीं किया जा सकता"

Mediastore से यूआरआइ से फाइल नाम और पथ प्राप्त करें

मेरे पास एक onActivityResult छवि चयन से onActivityResult लौट रहा है, जिसे मैं निम्न का उपयोग करके एक छवि के लिए यूआरआई प्राप्त कर सकता हूं:

 Uri selectedImage = data.getData(); 

इसे एक स्ट्रिंग में परिवर्तित करने देता है:

 content://media/external/images/media/47 

या एक मार्ग के लिए देता है:

 /external/images/media/47 

हालांकि मुझे यह एक पूर्ण पथ में परिवर्तित करने का तरीका नहीं मिल सकता है, क्योंकि मैं इसे कहीं और प्रतिलिपि किए बिना छवि को बिटमैप में लोड करना चाहता हूं। मुझे पता है कि यह यूआरआई और कन्टैंट रिज़ॉल्वर का उपयोग करके किया जा सकता है, लेकिन यह फोन के रिबूट पर टूटने लगता है, मुझे लगता है कि MediaStore रिबूट के बीच इसका MediaStore नहीं रखता है

वेब के समाधान से एकत्रित समाधान "Mediastore से यूआरआइ से फाइल नाम और पथ प्राप्त करें"

 public String getRealPathFromURI(Context context, Uri contentUri) { Cursor cursor = null; try { String[] proj = { MediaStore.Images.Media.DATA }; cursor = context.getContentResolver().query(contentUri, proj, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } finally { if (cursor != null) { cursor.close(); } } } 

पहला जवाब पर बस एक साधारण अपडेट: mActivity.managedQuery() अब बहिष्कृत किया गया है मैंने कोड को नई विधि के साथ अपडेट किया है

 private String getRealPathFromURI(Uri contentUri) { String[] proj = { MediaStore.Images.Media.DATA }; CursorLoader loader = new CursorLoader(mContext, contentUri, proj, null, null, null); Cursor cursor = loader.loadInBackground(); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String result = cursor.getString(column_index); cursor.close(); return result; } 

एंड्रॉइड देव स्रोत

फाइल सिस्टम में एक यूरी ढूँढ़ने की कोशिश न करें, जो डेटाबेस में चीजों को देखने के लिए धीमा है।

कारखाने के लिए एक फ़ाइल देते हुए कारखाने को एक इनपुट स्ट्रीम देकर आप यूरी से एक बिटमैप प्राप्त कर सकते हैं:

 InputStream is = getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is); is.close(); 

सभी संस्करणों के लिए मैंने इस विधि को बनाया है जो यूरी से वास्तविक पथ प्राप्त करते हैं

  @SuppressLint("NewApi") public static String getFilePath(Context context, Uri uri) throws URISyntaxException { String selection = null; String[] selectionArgs = null; // Uri is different in versions after KITKAT (Android 4.4), we need to if (Build.VERSION.SDK_INT >= 19 && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) { if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); return Environment.getExternalStorageDirectory() + "/" + split[1]; } else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); uri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); } else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("image".equals(type)) { uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } selection = "_id=?"; selectionArgs = new String[]{ split[1] }; } } if ("content".equalsIgnoreCase(uri.getScheme())) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = null; try { cursor = context.getContentResolver() .query(uri, projection, selection, selectionArgs, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } catch (Exception e) { } } else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } 

यहां यूआरआइ से फ़ाइल: // … और सामग्री: // … फ़ाइल नाम प्राप्त करने का मेरा यह उदाहरण है। यह मेरे लिए केवल एंड्रॉइड मीडियास्टोर के साथ ही काम करता है, लेकिन साथ ही तीसरे भाग के साथ जैसे ईज़ एक्सप्लोरर

 public static String getFileNameByUri(Context context, Uri uri) { String fileName="unknown";//default fileName Uri filePathUri = uri; if (uri.getScheme().toString().compareTo("content")==0) { Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); if (cursor.moveToFirst()) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);//Instead of "MediaStore.Images.Media.DATA" can be used "_data" filePathUri = Uri.parse(cursor.getString(column_index)); fileName = filePathUri.getLastPathSegment().toString(); } } else if (uri.getScheme().compareTo("file")==0) { fileName = filePathUri.getLastPathSegment().toString(); } else { fileName = fileName+"_"+filePathUri.getLastPathSegment(); } return fileName; } 

अच्छे मौजूदा उत्तर, जिनमें से कुछ मैं स्वयं के साथ आया था:

मुझे यूआरआई से पथ प्राप्त करना होगा और पथ से यूआरआई प्राप्त करना होगा, और Google को एक कठिन समय है, जिससे किसी भी ऐसे व्यक्ति के लिए अंतर हो सकता है (उदाहरण के लिए, वीडियो के MediaStore से थंबनेल प्राप्त करने के लिए जिसका भौतिक स्थान आप पहले से ही है ) है। भूतपूर्व:

 /** * 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; } 

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

 /** * 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 कॉलम (या जो इसके बारे में सब-सेक्शन आप पूछ रहे हैं) फ़ाइल पथ को संग्रहीत करता है, इसलिए आप या तो उस DATA उपयोग कर सकते हैं जो आपको पता है कि DATA फ़ील्ड देखने के लिए या फ़ील्ड का उपयोग आप जो कुछ भी चाहते हैं ।

मैं अपने डेटा के साथ क्या करना है यह जानने के लिए इसके बाद मैं इसके बाद के संस्करण की Scheme उपयोग करता हूं:

  private boolean getSelectedVideo(Intent imageReturnedIntent, boolean fromData) { Uri selectedVideoUri; //Selected image returned from another activity // A parameter I pass myself to know whether or not I'm being "shared via" or // whether I'm working internally to my app (fromData = working internally) if(fromData){ selectedVideoUri = imageReturnedIntent.getData(); } else { //Selected image returned from SEND intent // which I register to receive in my manifest // (so people can "share via" my app) selectedVideoUri = (Uri)getIntent().getExtras().get(Intent.EXTRA_STREAM); } Log.d(TAG,"SelectedVideoUri = " + selectedVideoUri); String filePath; String scheme = selectedVideoUri.getScheme(); ContentResolver contentResolver = getContentResolver(); long videoId; // If we are sent file://something or content://org.openintents.filemanager/mimetype/something... if(scheme.equals("file") || (scheme.equals("content") && selectedVideoUri.getEncodedAuthority().equals("org.openintents.filemanager"))){ // Get the path filePath = selectedVideoUri.getPath(); // Trim the path if necessary // openintents filemanager returns content://org.openintents.filemanager/mimetype//mnt/sdcard/xxxx.mp4 if(filePath.startsWith("/mimetype/")){ String trimmedFilePath = filePath.substring("/mimetype/".length()); filePath = trimmedFilePath.substring(trimmedFilePath.indexOf("/")); } // Get the video ID from the path videoId = getVideoIdFromFilePath(filePath, contentResolver); } else if(scheme.equals("content")){ // If we are given another content:// URI, look it up in the media provider videoId = Long.valueOf(selectedVideoUri.getLastPathSegment()); filePath = getFilePathFromContentUri(selectedVideoUri, contentResolver); } else { Log.d(TAG,"Failed to load URI " + selectedVideoUri.toString()); return false; } return true; } 

इनमें से कोई भी उत्तर सभी मामलों में मेरे लिए काम नहीं करता। इस विषय पर मुझे सीधे Google के प्रलेखन https://developer.android.com/guide/topics/providers/document-provider.html पर जाना पड़ा और यह उपयोगी विधि मिली:

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

आप इस बिटमैप को किसी छवि दृश्य में प्रदर्शित करने के लिए उपयोग कर सकते हैं।

उन लोगों के लिए समाधान, जिनके पास किटकैट में जाने के बाद समस्या है:

"यह अनधिकृत सामग्री प्रदाता विधि पर वापस गिरने के दौरान, मीडियाप्रदाता, डाउनलोडप्रोवाइडर, और बाहरी स्टोरेजप्रोवाइडर से फ़ाइल पथ प्राप्त करेगा" https://stackoverflow.com/a/20559175/690777

चूंकि प्रबंधित की गई सामग्री को नापसंद किया गया है, इसलिए आप कोशिश कर सकते हैं:

 CursorLoader cursorLoader = new CursorLoader(context, uri, proj, null, null, null); Cursor cursor = cursorLoader.loadInBackground(); 

यहां आपको फ़ाइल का नाम मिलता है

 String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME}; Uri uri = data.getData(); String fileName = null; ContentResolver cr = getActivity().getApplicationContext().getContentResolver(); Cursor metaCursor = cr.query(uri, projection, null, null, null); if (metaCursor != null) { try { if (metaCursor.moveToFirst()) { fileName = metaCursor.getString(0); } } finally { metaCursor.close(); } } 

यहां मैं आपको दिखाता हूं कि ब्राउज बटन कैसे बनाया जाए, जब आप क्लिक करेंगे, तो यह एसडी कार्ड खुल जाएगा, आप एक फाइल का चयन करेंगे और नतीजतन, आपको चयनित फाइल नाम और फ़ाइल पथ मिलेगा एक:

एक बटन जिसे आप हिट करेंगे

 browse.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); Uri startDir = Uri.fromFile(new File("/sdcard")); startActivityForResult(intent, PICK_REQUEST_CODE); } }); 

फ़ंक्शन जो परिणामस्वरूप फ़ाइल का नाम और फ़ाइल पथ प्राप्त करेगा

 protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == PICK_REQUEST_CODE) { if (resultCode == RESULT_OK) { Uri uri = intent.getData(); if (uri.getScheme().toString().compareTo("content")==0) { Cursor cursor =getContentResolver().query(uri, null, null, null, null); if (cursor.moveToFirst()) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);//Instead of "MediaStore.Images.Media.DATA" can be used "_data" Uri filePathUri = Uri.parse(cursor.getString(column_index)); String file_name = filePathUri.getLastPathSegment().toString(); String file_path=filePathUri.getPath(); Toast.makeText(this,"File Name & PATH are:"+file_name+"\n"+file_path, Toast.LENGTH_LONG).show(); } } } } } 

गैलरी से एक चित्र प्राप्त करने के बाद, केवल एंड्रॉइड 4.4 (किटकैट) के लिए यूआरआई को नीचे की विधि में पास करें:

 public String getPath(Uri contentUri) {// Will return "image:x*" String wholeID = DocumentsContract.getDocumentId(contentUri); // Split at colon, use second item in the array String id = wholeID.split(":")[1]; String[] column = { MediaStore.Images.Media.DATA }; // Where id is equal to String sel = MediaStore.Images.Media._ID + "=?"; Cursor cursor = getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel, new String[] { id }, null); String filePath = ""; int columnIndex = cursor.getColumnIndex(column[0]); if (cursor.moveToFirst()) { filePath = cursor.getString(columnIndex); } cursor.close(); return filePath; } 

यह समाधान हर मामले के लिए काम करता है:

कुछ मामलों में यह बहुत मुश्किल है कि यूआरएल से पथ निकल जाए। तो आपको पथ की आवश्यकता क्यों है? फ़ाइल को दूसरी जगह पर कॉपी करने के लिए? आपको पथ की आवश्यकता नहीं है

 public void SavePhotoUri (Uri imageuri, String Filename){ File FilePath = context.getDir(Environment.DIRECTORY_PICTURES,Context.MODE_PRIVATE); try { Bitmap selectedImage = MediaStore.Images.Media.getBitmap(context.getContentResolver(), imageuri); String destinationImagePath = FilePath + "/" + Filename; FileOutputStream destination = new FileOutputStream(destinationImagePath); selectedImage.compress(Bitmap.CompressFormat.JPEG, 100, destination); destination.close(); } catch (Exception e) { Log.e("error", e.toString()); } } 

@PercyPercy के थोड़ा संशोधित संस्करण – यह फेंकना नहीं है और अगर कुछ गलत हो जाता है तो केवल रिक्त देता है :

 public String getPathFromMediaUri(Context context, Uri uri) { String result = null; String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); int col = cursor.getColumnIndex(MediaStore.Images.Media.DATA); if (col >= 0 && cursor.moveToFirst()) result = cursor.getString(col); cursor.close(); return result; } 

सरल और आसान आप इसे नीचे की तरह URI से कर सकते हैं!

 public void getContents(Uri uri) { Cursor vidCursor = getActivity.getContentResolver().query(uri, null, null, null, null); if (vidCursor.moveToFirst()) { int column_index = vidCursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); Uri filePathUri = Uri.parse(vidCursor .getString(column_index)); String video_name = filePathUri.getLastPathSegment().toString(); String file_path=filePathUri.getPath(); Log.i("TAG", video_name + "\b" file_path); } } 

इसे उरी से छवि फ़ाइल पथ प्राप्त करने का प्रयास करें

 public void getImageFilePath(Context context, Uri uri) { Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); cursor.moveToFirst(); String image_id = cursor.getString(0); image_id = image_id.substring(image_id.lastIndexOf(":") + 1); cursor.close(); cursor = context.getContentResolver().query(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media._ID + " = ? ", new String[]{image_id}, null); cursor.moveToFirst(); String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); cursor.close(); upLoadImageOrLogo(path); } 

Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);