2015-05-29 10 views
41

मेरे ऐप में लाइब्रेरी से फ़ोटो चुनने की क्षमता है। वास्तव में मैं इस चयन से फ़ाइल पथ चाहता हूं।नए Google फ़ोटो ऐप का उपयोग करके फोटो चुनना

Cursor cursor = null; 
    String path = null; 
    try { 
     String[] projection = { MediaStore.Images.Media.DATA }; 
     cursor = context.getContentResolver().query(contentUri, projection, null, null, null); 
     int columnIndex = cursor.getColumnIndexOrThrow(projection[0]); 
     cursor.moveToFirst(); 
     path = cursor.getString(columnIndex); 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
    return path; 

से पहले की Google फ़ोटो कल के अपडेट के ऐप्स सब कुछ पूरी तरह से काम किया:

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, 
     MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    photoPickerIntent.setType("image/*"); 
    startActivityForResult(photoPickerIntent, INTENT_REQUEST_CODE_SELECT_PHOTO); 

इस कोड है कि URI से फ़ाइल पथ हो जाता है:

यह चयन करने के लिए तस्वीर आशय बनाने के लिए कोड है ठीक। अब path यूआरआई पार्सिंग के बाद शून्य है।

यूआरआई इस के समान है: content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209/ACTUAL

मैं भी Intent.ACTION_GET_CONTENT कार्रवाई के साथ आशय बनाने की कोशिश की है - कोई भाग्य।

उत्तर

41

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

आप एक ही कोशिश कर सकते हैं:

public static String getImageUrlWithAuthority(Context context, Uri uri) { 
    InputStream is = null; 
    if (uri.getAuthority() != null) { 
     try { 
      is = context.getContentResolver().openInputStream(uri); 
      Bitmap bmp = BitmapFactory.decodeStream(is); 
      return writeToTempImageAndGetPathUri(context, bmp).toString(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     }finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return null; 
} 

public static Uri writeToTempImageAndGetPathUri(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); 
} 
+2

पर यह क्रैश मैंने इस जवाब को स्वीकार कर लिया है, हालांकि हमारे प्रवाह के लिए यह एक कामकाज है। लेकिन यह ऐप को पूरी तरह से काम करने वाली स्थिति में वापस लाने की अनुमति देता है, इसलिए यह मायने रखता है। एक नोट: मैंने इनपुटस्ट्रीम से बिटमैप डिकोडिंग नहीं किया - मैंने इसे कुछ 'फ़ाइल tempFile = नई फ़ाइल ("path_to_my_temp_directory") पर कॉपी किया है; और फिर सभी चीजों के लिए अंतिम बार उपयोग किया। –

+0

@ अखिल इस के लिए धन्यवाद! – Petro

+0

'है = context.getContentResolver()। OpenInputStream (uri);' शून्य वापस आ रहा है। मुझे Google फ़ोटो एप से छवियों को चुनने के लिए कोई समाधान नहीं मिल रहा है। अगर किसी के पास कोई समाधान समाधान है, तो कृपया साझा करें। – ArJ

6

यह सबसे निश्चित रूप से एक समाधान नहीं है, लेकिन आप वास्तविक सामग्री यूआरआई जो जाहिरा तौर पर किसी कारण से एम्बेडेड हो गई है निकाल सकते: content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209

मैं authority=media and path=external/images/media/xxx के साथ एक नया यूआरआई बनाने में सक्षम था, और सामग्री रिसोल्वर एक असली लौटे यूआरएल।

उदाहरण कोड:

String unusablePath = contentUri.getPath(); 
int startIndex = unusablePath.indexOf("external/"); 
int endIndex = unusablePath.indexOf("/ACTUAL"); 
String embeddedPath = unusablePath.substring(startIndex, endIndex); 

Uri.Builder builder = contentUri.buildUpon(); 
builder.path(embeddedPath); 
builder.authority("media"); 
Uri newUri = builder.build(); 
+1

आपको लगता है कि किसी भी स्रोत कोड साझा कर सकते हैं? –

+0

क्या आप इस समाधान के लिए स्रोत साझा कर सकते हैं? इस मुद्दे पर कुछ दिनों के लिए अटक गया! – Vishy

+2

जोड़ा गया उदाहरण कोड –

संबंधित मुद्दे