2012-03-30 9 views
14

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

File f = storeImage(image); // f = /data/data/com.myapp/files/1333070776978.jpg 
    Uri uri = Uri.fromFile(f); 

    Intent share = new Intent(Intent.ACTION_SEND); 
    share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    share.setType("image/jpeg"); 
    share.putExtra(Intent.EXTRA_STREAM, uri); 
    share.putExtra(Intent.EXTRA_TITLE,"Share that title"); 
    share.putExtra(Intent.EXTRA_SUBJECT,"Share that subject"); 
    share.putExtra(Intent.EXTRA_TEXT,"Check that out..."); 
    share.putExtra("sms_body", "sms body"); 
    startActivity(Intent.createChooser(share, "Share Image")); 

मैं

Context.openFileOutput(fileName, Context.MODE_WORLD_READABLE); 

मेरी समझ के साथ छवि को बचाने कि FLAG_GRANT_READ_URI_PERMISSION स्थापना करके, मैं गूगल + इस फ़ाइल के लिए विशिष्ट पहुँच प्रदान किया गया था।

यह काम करता है जब मैं छवि को मीडियास्टोर में संग्रहीत करता हूं, लेकिन मैं वास्तव में उपयोगकर्ताओं की छवि गैलरी को अव्यवस्थित नहीं करना चाहता हूं।

ContentValues values = new ContentValues(2); 
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); 
    values.put(MediaStore.Images.Media.DATA, f.getAbsolutePath()); 
    Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

किसी भी सलाह

साइमन

+0

आपको हमेशा यह सुनिश्चित कर सकता है क्या फ़ाइल और फ़ोल्डर है अनुमतियाँ, फाइल सिस्टम ग्रहण में डिबग उपकरण का उपयोग कर में देख। यह सुनिश्चित करने के लिए कि आप अनुमतियों की कमी से पीड़ित नहीं हैं। – erbsman

+0

फ़ाइल अनुमतियां अच्छी लगती हैं (-rw-rw-r--)। वैसे भी, एसएमएस ऐप या फेसबुक जैसे अन्य ऐप्स छवि को एक्सेस और साझा कर सकते हैं। – SimonSays

+0

क्या होगा यदि आप Context.getCacheDir() का उपयोग कर छवि को कैश निर्देशिका में संग्रहीत करते हैं? – Freddroid

उत्तर

6

Google+ किसी अन्य एप्लिकेशन के निजी फ़ोल्डर से file:// उरीज़ तक नहीं पहुंच सकता है। और FLAG_GRANT_READ_URI_PERMISSION इस मामले में काम नहीं करता है क्योंकि यह केवल इरादे के "डेटा" भाग में यूरी के लिए है, लेकिन अतिरिक्त के लिए नहीं।

गैलरी में इसे जोड़ने के लिए एक आम कामकाज है (MediaStore के माध्यम से) लेकिन ऐसा करने के लिए आवश्यक नहीं है। इस मामले में सही समाधान का उपयोग करने के लिए है एक FileProvider:

FileProvider ContentProvider की एक विशेष उपवर्ग है कि एक file:/// उरी के बजाय एक फ़ाइल के लिए कोई content:// उरी बनाकर कोई एप्लिकेशन से संबद्ध फाइलों का सुरक्षित साझा करने की सुविधा है ।

सबसे पहले अपने एंड्रॉइडमैनिफेस्ट में निम्न स्थान दें।एक्सएमएल

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="com.myapp.testshare.fileprovider" 
    android:grantUriPermissions="true" 
    android:exported="false"> 
    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/filepaths" /> 
</provider> 

फिर res\xml\filepaths.xml में इस फ़ाइल:

<?xml version="1.0" encoding="utf-8"?> 
<paths> 
    <files-path name="shared_images" path="shared_images/" /> 
</paths> 

फिर, एक छवि फ़ाइल साझा करने के लिए, यकीन है कि यह रास्ता ऊपर निर्दिष्ट में है (यानी shared_imagesgetFilesDir() से कम) बनाने के लिए और आशय का निर्माण इस प्रकार है:

File file = getImageFileToShare(); 
Uri fileUri = FileProvider.getUriForFile(this, "com.myapp.testshare.fileprovider", file); 

Intent intent = new Intent(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_STREAM, fileUri); 
intent.setType("image/png"); 
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

startActivity(intent); 

(यकीन है कि प्राधिकरण getUriForFile() विधि में विनिर्दिष्ट बनाओ प्रकट में से मेल खाता है)।

यह content:// उरी (जैसे content://com.myapp.testshare.fileprovider/shared_images/img1.png का उत्पादन करेगा कि Google+ ऐप एक्सेस करने में सक्षम होगा, और इस प्रकार पोस्ट में शामिल होगा)।

+0

वाह, यह एक अच्छा समाधान जैसा दिखता है। वास्तव में इसे अभी सत्यापित करें, लेकिन मुझे लगता है कि आपने यह किया है और यह काम करता है, इसलिए मैं इसे समाधान के रूप में चिह्नित करूंगा। धन्यवाद आदमी, मैंने इसके लिए 2 साल का इंतजार किया :-) – SimonSays

+0

मैं यूनिटीजैम का स्क्रीनशॉट साझा करना चाहता हूं, एकता से मैं छवि को "डेटा/डेटा/com.mypackage.name/files/filesShot.png" पर कैप्चर करना। मैंने एक ही प्रक्रिया का पालन किया लेकिन मुझे NullPointerException मिल रहा है। क्या आप नमूना परियोजना साझा कर सकते हैं? – Prasanna

+1

क्या एक अच्छा जवाब है। मैंने इसका परीक्षण किया है और यह पूरी तरह से काम करता है। एकमात्र चुनौती फ़ाइल को 'shared_images' फ़ोल्डर में कॉपी कर रही थी, जिसे मैंने इस कोड की सहायता से किया था: http://stackoverflow.com/a/11327789/1617737 –

2

साइमन,

लगता है जैसे कि यह अनुमति सेट करने आप uri सेट करने के बाद काम करता है की सराहना की है।

share.putExtra(Intent.EXTRA_STREAM, uri); 
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
+1

नहीं, यह काम नहीं करता है ... – SimonSays

+1

डर्न। मेरे लिए भी काम नहीं किया। – Doug

+0

मैं अपने कैश से छवियों को साझा करने के लिए एक अनुकूलित सामग्री प्रदाता का उपयोग कर रहा हूं निर्देशिका। इस ध्वज को जोड़ना * आखिरकार * मुझे छवि गैलरी में फाइलों की प्रतिलिपि बनाने के बिना Google + में छवि संलग्न करने की इजाजत दी गई। – Mark

1

इस एक कोशिश .. मैं भी अपने गैलरी में प्रदर्शित के रूप में इस के साथ समस्या आ रही है, तो मैं एक डालने करते हैं,

बाहर // यहाँ एक फ़ाइल उदाहरण

String uriString = MediaStore.Images.Media.insertImage(getContentResolver(), 
       out.getAbsolutePath(),null,null); 
intent.putExtra(Intent.EXTRA_STREAM,Uri.parse(uriString)); 
है

https://github.com/google-plus/google-plus-office-hours/blob/master/2012_08_14-curiosity-android-app/src/com/example/CuriosityActivity.java

1

यदि आप कस्टम सामग्री प्रदाता का उपयोग कर रहे हैं तो आपको यह जांचना होगा कि छवियों का एमआईएमई प्रकार सही है। एक जेपीईजी के लिए सही एमआईएम "छवि/जेपीईजी" है। यदि आप ओवरराइड GetType (उरी uri) में "छवि/jpg" वापस करते हैं; विधि तब Google+ उन्हें संलग्न करने में विफल रहता है। अधिकांश अन्य काम, उदा। संदेश और ईमेल। "छवि/जेपीजी" मान्य IANA MIME प्रकार नहीं है:

http://www.iana.org/assignments/media-types/image

GetType की विनिर्देश इस बारे में स्पष्ट है, लेकिन यह बहुत (मैंने किया था) याद आती है करने के लिए आसान है। इसे हल करने के बाद, मैं यह सुनिश्चित करना चाहता था कि दूसरों को यह पता चले क्योंकि यह बहुत ही अजीब है।

0

आप इस का उपयोग कर सकते हैं:

Drawable drawable; 
File file; 
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) { 
    drawable = getResources().getDrawable(imgResId); 
} else { 
    drawable = getResources().getDrawable(imgResId, null); 
} 

if (drawable != null) { 
    Bitmap bm = ((BitmapDrawable) drawable).getBitmap(); 

    String path = Environment.getExternalStorageDirectory() 
      .toString(); 
    OutputStream fOut = null; 
    file = new File(path, "pic.jpg"); // the File to save to 
    try { 
     file.createNewFile(); 
     fOut = new FileOutputStream(file); 

     // obtaining the Bitmap 
     bm.compress(Bitmap.CompressFormat.JPEG, 100, fOut); 
     fOut.flush(); 
     fOut.close(); 
     return file; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
संबंधित मुद्दे