Android में चित्र साझा करने के इरादे से "शेयर इमेज का उपयोग करके" साझा करने का उपयोग कैसे करें?


80

मेरे पास उस ऐप में इमेज गैली ऐप है, मैंने सभी छवियों को ड्रॉबल-एचडीपीआई फ़ोल्डर में रखा है। और मैंने इस तरह से अपनी गतिविधि में छवियों को बुलाया:

private Integer[] imageIDs = {
        R.drawable.wall1, R.drawable.wall2,
        R.drawable.wall3, R.drawable.wall4,
        R.drawable.wall5, R.drawable.wall6,
        R.drawable.wall7, R.drawable.wall8,
        R.drawable.wall9, R.drawable.wall10
};

तो अब मैं यह जानना चाहता हूं कि मैं इस चित्र को साझा करने के इरादे से कैसे साझा करूं मैं इस तरह साझा किए गए कोड साझा कर रहा हूं:

     Button shareButton = (Button) findViewById(R.id.share_button);
     shareButton.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
       
        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        Uri screenshotUri = Uri.parse(Images.Media.EXTERNAL_CONTENT_URI + "/" + imageIDs);

        sharingIntent.setType("image/jpeg");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
        startActivity(Intent.createChooser(sharingIntent, "Share image using"));  
    
         }
    });

और मेरे पास शेयरिंग बटन भी है जब मैं शेयर बटन पर क्लिक करता हूं तो शेयरिंग बॉक्स खुल रहा है लेकिन जब मैं किसी भी सेवा को बंद कर देता हूं तो ज्यादातर इसकी दुर्घटनाग्रस्त हो जाती है या कुछ सेवाओं का कहना है: छवि को खोलने में असमर्थ तो मैं इसे कैसे ठीक कर सकता हूं या छवियों को साझा करने के लिए कोई अन्य प्रारूप कोड है ????

संपादित करें:

मैंने नीचे दिए गए कोड का उपयोग करने की कोशिश की। लेकिन इसका काम नहीं हो रहा है।

Button shareButton = (Button) findViewById(R.id.share_button);
     shareButton.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {

        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        Uri screenshotUri = Uri.parse("android.resource://com.android.test/*");
        try {
            InputStream stream = getContentResolver().openInputStream(screenshotUri);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        sharingIntent.setType("image/jpeg");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
        startActivity(Intent.createChooser(sharingIntent, "Share image using"));  

         }
    });

अगर किसी को बुरा न लगे तो मेरे उपरोक्त कोड को सही करें या मुझे एक उचित उदाहरण दें plz मैं अपनी छवियों को कैसे आकर्षित कर सकता हूं- hdpi फ़ोल्डर


आप URI पार्स विधि में पूरे सरणी को पारित कर रहे हैं
प्रतीक

आप गलत यूआरआई सेट कर रहे हैं। इसलिए यह समस्या उत्पन्न होती है। फिर से आप कई छवियों को साझा करने का प्रयास कर रहे हैं, ताकि आप stackoverflow.com/questions/2264622/… का उपयोग करें और सही URI सेट करने के लिए आपको stackoverflow.com/questions/6602417/…
कार्तिक डोमडायरेक्ट

यहाँ मेरी मदद करें stackoverflow.com/questions/31826494/…
आदित्य

जवाबों:


114
Bitmap icon = mBitmap;
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
icon.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
File f = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");
try {
    f.createNewFile();
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());
} catch (IOException e) {                       
        e.printStackTrace();
}
share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/temporary_file.jpg"));
startActivity(Intent.createChooser(share, "Share Image"));

3
क्या उपयोग करने File f = File.createTempFile("sharedImage", suffix, getExternalCacheDir());और उपयोग करने के खिलाफ कोई कारण है share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));?
cimnine

15
हां, यदि आप createTempFile का उपयोग करते हैं, तो फ़ाइल एक निर्देशिका में बनाई जाती है जो आपके ऐप के लिए निजी है। इस प्रकार, अन्य एप्लिकेशन (यानी, जिन्हें आप साझा कर रहे हैं) छवि को पुनः प्राप्त करने में असमर्थ होंगे।
aleph_null

7
साथ ही आपको आउटपुट स्ट्रीम को बंद करना चाहिए।
मार्टन

2
@superM मुझे मदद कर सकता है कि मैं कैसे
ड्रा करने

7
1.) अपने FileOutputStream को बंद करना न भूलें। 2.) हार्डकोड मत करो "/ sdcard /"; एनवायरनमेंट .getExternalStorageDirectory ()। getPath () की जगह
linuxjava

41

सुपरम से प्रस्तावित समाधान ने मेरे लिए लंबे समय तक काम किया, लेकिन हाल ही में मैंने इसे 4.2 (एचटीसी वन) पर परीक्षण किया और इसने वहां काम करना बंद कर दिया। मुझे पता है कि यह एक वर्कअराउंड है, लेकिन यह केवल एक ही था जिसने सभी उपकरणों और संस्करणों के साथ मेरे लिए काम किया।

प्रलेखन के अनुसार, डेवलपर्स को बाइनरी सामग्री भेजने के लिए "सिस्टम मीडियास्टोर का उपयोग करने " के लिए कहा जाता है। हालांकि, इसका (डिस) लाभ यह है कि मीडिया सामग्री को डिवाइस पर स्थायी रूप से सहेजा जाएगा।

यदि यह आपके लिए एक विकल्प है, तो आप अनुमति देना चाहते WRITE_EXTERNAL_STORAGEहैं और सिस्टम-वाइड मीडियास्टोर का उपयोग कर सकते हैं ।

Bitmap icon = mBitmap;
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");

ContentValues values = new ContentValues();
values.put(Images.Media.TITLE, "title");
values.put(Images.Media.MIME_TYPE, "image/jpeg");
Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI,
        values);


OutputStream outstream;
try {
    outstream = getContentResolver().openOutputStream(uri);
    icon.compress(Bitmap.CompressFormat.JPEG, 100, outstream);
    outstream.close();
} catch (Exception e) {
    System.err.println(e.toString());
}

share.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(share, "Share Image"));

3
यह एकमात्र समाधान है जिसने मुझे फेसबुक में साझा करने के लिए काम किया है! धन्यवाद।
मोती बार्टोव

9
यह एक नई छवि बनाता है। मैं नई छवि कैसे हटाऊं?
ब्लूमांगो

2
@BlueMango क्या आपको कोई समाधान मिला?
अक्स

एकदम सही जवाब! हर ऐप में काम करता है!
डायनाकारेंम्स

26

पहले अनुमति दें

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

संसाधनों से बिटमैप का उपयोग करना

Bitmap b =BitmapFactory.decodeResource(getResources(),R.drawable.userimage);
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(getContentResolver(), b, "Title", null);
Uri imageUri =  Uri.parse(path);
share.putExtra(Intent.EXTRA_STREAM, imageUri);
startActivity(Intent.createChooser(share, "Select"));

ब्लूटूथ और अन्य दूतों के माध्यम से परीक्षण किया गया


whats app और सभी जैसे url से image कैसे भेजे
हर्षा

अगर आप url से दूसरे ऐप में इमेज शेयर करना चाहते हैं। आपको इमेज को Bitmap stackoverflow.com/questions/18210700/… पर डाउनलोड करना होगा और फिर शेयर इंटेंस का उपयोग करना होगा।
हेमंत शोरी

और फिर संलग्न चित्र के बाद और उस ऐप को बंद करने का तरीका साझा किया और हमारे ऐप पर जाएं Android
Harsha

1
@ हर्ष लोल। FYI करें, u संभाल नहीं सकता है कि अगर कोई उर ऐप छोड़ता है तो कुछ कैसे। उसे हाल ही में जाना होगा और उर ऐप को दोबारा शुरू करना होगा। अन्य तरीके से नहीं। आप किसी और के ऐप पर कैसे नियंत्रण कर सकते हैं?
हेमंत शोरी


20

मुझे ऐसा करने का सबसे आसान तरीका मीडियास्टार का उपयोग करके उस छवि को अस्थायी रूप से संग्रहीत करना है जिसे आप साझा करना चाहते हैं:

Drawable mDrawable = mImageView.getDrawable();
Bitmap mBitmap = ((BitmapDrawable) mDrawable).getBitmap();

String path = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "Image Description", null);
Uri uri = Uri.parse(path);

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(intent, "Share Image"));

से: इरादों के साथ सामग्री साझा करना


canvasचर की कोई आवश्यकता नहीं है , इसका कहीं भी उपयोग नहीं किया जाता है।
फर्नांडो एम। पिनहिरो

2
मैनिफ़ेस्ट को प्रकट करने के लिए मत भूलना। xml: <उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.WRITE_EXTERNAL_STORAGE" />
हामिद

13

एंड्रॉइड में इमेज को आसानी से कैसे साझा करें, कभी-कभी आप अपने दृश्य का स्नैपशॉट लेना चाहते हैं और फिर इसे साझा करना पसंद करते हैं, इसलिए इन चरणों का पालन करें: 1. मुख्य फाइल की अनुमति दें

<uses-permission    
   android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2.Very पहले अपने विचार का स्क्रीनशॉट लें, उदाहरण के लिए यह Imageview, Textview, Framelayout, LinearLayf आदि।

उदाहरण के लिए आपके पास स्क्रीनशॉट लेने के लिए एक छवि है

 ImageView image= (ImageView)findViewById(R.id.iv_answer_circle);
     ///take a creenshot
    screenShot(image);

स्क्रीनशॉट कॉल शेयर इमेज विधि लेने के बाद या तो बटन पर क्लिक
करें या जहाँ आप चाहते हैं

shareBitmap(screenShot(image),"myimage");

बनाने की विधि के बाद इन दोनों विधि को परिभाषित करें ##

    public Bitmap screenShot(View view) {
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
            view.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

//////// this method share your image
private void shareBitmap (Bitmap bitmap,String fileName) {
    try {
        File file = new File(getContext().getCacheDir(), fileName + ".png");
        FileOutputStream fOut = new FileOutputStream(file);
        bitmap.compress(CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        file.setReadable(true, false);
        final Intent intent = new Intent(     android.content.Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        intent.setType("image/png");
        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

".SetFlags (Intent.FLAG_ACTIVITY_NEW_TASK) क्या है?" आपके द्वारा ऊपर सेट किए गए इरादे के लिए उपयोग किया जाता है?
एजेडब्ल्यू

12

सरल और सबसे आसान कोड जिसका उपयोग आप गैलरी से छवि साझा करने के लिए कर सकते हैं।

 String image_path;
            File file = new File(image_path);
            Uri uri = Uri.fromFile(file);
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent .setType("image/*");
            intent .putExtra(Intent.EXTRA_STREAM, uri);
            context.startActivity(intent );

सरल और शक्तिशाली, छवि को बचाने की आवश्यकता नहीं है या ऐसा कभी भी नहीं हुआ है, उपरोक्त सभी उत्तरों ने मेरे लिए काम नहीं किया है लेकिन यह सरल समाधान चाल करता है ... धन्यवाद यो बहुत .... वैसे मैंने इस कोड को अपने पर परीक्षण किया है Android के
ओरियो

10

यहां एक समाधान है जो मेरे लिए काम करता है। एक गेचा आपको एक साझा या गैर-एप्लिकेशन निजी स्थान ( http://developer.android.com/guide/topics/data/data-storage.html#InternalCache) में छवियों को संग्रहीत करने की आवश्यकता है )

कई सुझावों में स्टोर करने के लिए कहते हैं Apps "निजी" कैश स्थान लेकिन यह निश्चित रूप से अन्य बाहरी अनुप्रयोगों के माध्यम से सुलभ नहीं है, जिसमें जेनेरिक शेयर फ़ाइल इरादा भी शामिल है जिसका उपयोग किया जा रहा है। जब आप यह कोशिश करते हैं, तो यह चलेगा लेकिन उदाहरण के लिए ड्रॉपबॉक्स आपको बताएगा कि फ़ाइल अब उपलब्ध नहीं है।

/ * STEP 1 - नीचे दिए गए फ़ाइल सेव फंक्शन का उपयोग करके स्थानीय रूप से बिटमैप फ़ाइल सहेजें। * /

localAbsoluteFilePath = saveImageLocally(bitmapImage);

/ * STEP 2 - शेयर फ़ाइल के इरादे से गैर निजी निरपेक्ष फ़ाइल पथ साझा करें * /

if (localAbsoluteFilePath!=null && localAbsoluteFilePath!="") {

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    Uri phototUri = Uri.parse(localAbsoluteFilePath);

    File file = new File(phototUri.getPath());

    Log.d(TAG, "file path: " +file.getPath());

    if(file.exists()) {
        // file create success

    } else {
        // file create fail
    }
    shareIntent.setData(phototUri);
    shareIntent.setType("image/png");
    shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri);
    activity.startActivityForResult(Intent.createChooser(shareIntent, "Share Via"), Navigator.REQUEST_SHARE_ACTION);
}   

/ * सेव इमेज फंक्शन * /

    private String saveImageLocally(Bitmap _bitmap) {

        File outputDir = Utils.getAlbumStorageDir(Environment.DIRECTORY_DOWNLOADS);
        File outputFile = null;
        try {
            outputFile = File.createTempFile("tmp", ".png", outputDir);
        } catch (IOException e1) {
            // handle exception
        }

        try {
            FileOutputStream out = new FileOutputStream(outputFile);
            _bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.close();

        } catch (Exception e) {
            // handle exception
        }

        return outputFile.getAbsolutePath();
    }

/ * STEP 3 - शेयर फाइल इंटेंट परिणाम। दूरस्थ अस्थायी फ़ाइल आदि की आवश्यकता है * /

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

            // deal with this with whatever constant you use. i have a navigator object to handle my navigation so it also holds all mys constants for intents
        if (requestCode== Navigator.REQUEST_SHARE_ACTION) {
            // delete temp file
            File file = new File (localAbsoluteFilePath);
            file.delete();

            Toaster toast = new Toaster(activity);
            toast.popBurntToast("Successfully shared");
        }


    }   

मुझे उम्मीद है कि किसी की मदद करता है।


1
Log.d का आपका उपयोग पिछड़ा हुआ है। यह टैग पहले संदेश है।
over_optimistic

2
निश्चित, मैं वास्तव में log.d का उपयोग नहीं करता, मेरे पास एक आवरण कार्य है। जब मैंने SO के लिए उपयुक्त बनाने के लिए उदाहरण बदला तो मुझे एक टाइपो बनाना चाहिए। चीयर्स
वायर्ड 00


8

मैं अपने एप्लिकेशन से अन्य एप्लिकेशन पर दृश्य या छवि साझा करने के लिए विभिन्न विकल्पों की खोज में थक गया था। और आखिरकार मुझे इसका हल मिल गया।

चरण 1: शेयर इंटेंट हैंडलिंग ब्लॉक। यह आपके फ़ोन में एप्लिकेशन की सूची के साथ आपकी विंडो को पॉप अप करेगा

public void share_bitMap_to_Apps() {

    Intent i = new Intent(Intent.ACTION_SEND);

    i.setType("image/*");
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    /*compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] bytes = stream.toByteArray();*/


    i.putExtra(Intent.EXTRA_STREAM, getImageUri(mContext, getBitmapFromView(relative_me_other)));
    try {
        startActivity(Intent.createChooser(i, "My Profile ..."));
    } catch (android.content.ActivityNotFoundException ex) {

        ex.printStackTrace();
    }


}

चरण 2: अपना दृष्टिकोण BItmap में परिवर्तित करना

public static Bitmap getBitmapFromView(View view) {
    //Define a bitmap with the same size as the view
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(),      view.getHeight(), Bitmap.Config.ARGB_8888);
    //Bind a canvas to it
    Canvas canvas = new Canvas(returnedBitmap);
    //Get the view's background
    Drawable bgDrawable = view.getBackground();
    if (bgDrawable != null)
        //has background drawable, then draw it on the canvas
        bgDrawable.draw(canvas);
    else
        //does not have background drawable, then draw white background on the canvas
        canvas.drawColor(Color.WHITE);
    // draw the view on the canvas
    view.draw(canvas);
    //return the bitmap
    return returnedBitmap;
}

चरण 3 :

बिटमैप छवि से URI प्राप्त करने के लिए

public Uri getImageUri(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);
}

4

मुझे बस यही समस्या थी।
यहां एक उत्तर दिया गया है जो आपके मुख्य कोड में किसी भी स्पष्ट फ़ाइल लेखन का उपयोग नहीं करता है (आपके लिए एपीआई इसकी देखभाल कर रहा है)।

Drawable mDrawable = myImageView1.getDrawable();
Bitmap mBitmap = ((BitmapDrawable)mDrawable).getBitmap();
String path = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "Image I want to share", null);
Uri uri = Uri.parse(path);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Share Image"));

यह पथ है ... आपको अपनी छवि आईडी को एक ड्रा करने योग्य ऑब्जेक्ट में जोड़ने की आवश्यकता है। मेरे मामले में (ऊपर दिए गए कोड), ड्रा करने योग्य को एक ImageView से निकाला गया था।


3

SuperM उत्तर ने मेरे लिए काम किया लेकिन Uri.fromFile () के बजाय Uri.parse ()।

Uri.parse () के साथ, इसने केवल व्हाट्सएप के साथ काम किया।

यह मेरा कोड है:

sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(mFile));

Uri.parse ():
/storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg का आउटपुट

Uri.fromFile का आउटपुट:
फ़ाइल: ///storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg


3

इसे इस्तेमाल करे,

Uri imageUri = Uri.parse("android.resource://your.package/drawable/fileName");
      Intent intent = new Intent(Intent.ACTION_SEND);
      intent.setType("image/png");

      intent.putExtra(Intent.EXTRA_STREAM, imageUri);
      startActivity(Intent.createChooser(intent , "Share"));

3

रेफ: - http://developer.android.com/training/sharing/send.html#send-multiple-stent

ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Share images to.."));

2

आशय के माध्यम से शेयर पाठ और छवि के लिए एक सही समाधान है:

अपने शेयर बटन पर क्लिक करें:

Bitmap image;
shareimagebutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            URL url = null;
            try {
                url = new URL("https://firebasestorage.googleapis.com/v0/b/fir-notificationdemo-dbefb.appspot.com/o/abc_text_select_handle_middle_mtrl_light.png?alt=media&token=c624ab1b-f840-479e-9e0d-6fe8142478e8");
                image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            shareBitmap(image);
        }
    });

फिर शेयरबिटमैप (छवि) विधि बनाएँ।

private void shareBitmap(Bitmap bitmap) {

    final String shareText = getString(R.string.share_text) + " "
            + getString(R.string.app_name) + " developed by "
            + "https://play.google.com/store/apps/details?id=" + getPackageName() + ": \n\n";

    try {
        File file = new File(this.getExternalCacheDir(), "share.png");
        FileOutputStream fOut = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        file.setReadable(true, false);
        final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(Intent.EXTRA_TEXT, shareText);
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        intent.setType("image/png");
        startActivity(Intent.createChooser(intent, "Share image via"));

    } catch (Exception e) {
        e.printStackTrace();
    }

}

और फिर बस इसे टेस्ट करें .. !!


2

सब से ऊपर समाधान मेरे लिए काम नहीं करता है Android Api 26 & 27 (Oreo), मिल रहा था Error: exposed beyond app through ClipData.Item.getUri। मेरी स्थिति में जो समाधान फिट बैठता है वह था

  1. पथ यूरी का उपयोग कर के FileProvider.getUriForFile(Context,packagename,File)रूप में मिलता है
void shareImage() {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(this,getPackageName(),deleteFilePath));
        startActivity(Intent.createChooser(intent,"Share with..."));
    }
  1. <provider>अपने Manifest.xmlरूप में परिभाषित करें
<provider
     android:name="android.support.v4.content.FileProvider"
     android:authorities="com.example.stickerapplication"
      android:exported="false"
      android:grantUriPermissions="true">
      <meta-data
          android:name="android.support.FILE_PROVIDER_PATHS"
          android:resource="@xml/file_paths">
       </meta-data>
</provider>
  1. और अंतिम चरण resourceआपकी निर्देशिका के लिए फ़ाइल को परिभाषित करना है
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." />
</paths>
*Note this solution is for `external storage` `uri`

2

सभी को धन्यवाद, मैंने दिए गए विकल्पों में से कुछ की कोशिश की, लेकिन लगता है कि वे नवीनतम एंड्रॉइड रिलीज़ के लिए काम नहीं कर रहे हैं, इसलिए संशोधित कदमों को जोड़ना जो नवीनतम एंड्रॉइड रिलीज़ के लिए काम करते हैं। ये ऊपर दिए गए कुछ उत्तरों पर आधारित हैं, लेकिन संशोधनों और समाधान फ़ाइल प्रदाता के उपयोग पर आधारित हैं:

चरण 1

मेनिफेस्ट फ़ाइल में निम्नलिखित कोड जोड़ें:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_provider_paths" />
</provider>

चरण: 2 Res> xml में एक XML फ़ाइल बनाएँ

Xml के अंदर file_provider_paths फ़ाइल बनाएँ।

ध्यान दें कि यह वह फ़ाइल है जिसे हम एंड्रॉइड में शामिल करते हैं: पिछले चरण में संसाधन।

File_provider_paths के अंदर निम्नलिखित कोड लिखें:

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

चरण 3

इसके बाद अपने बटन पर जाएं क्लिक करें:

Button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

       Bitmap bit = BitmapFactory.decodeResource(context.getResources(),  R.drawable.filename);
        File filesDir = context.getApplicationContext().getFilesDir();
        File imageFile = new File(filesDir, "birds.png");
        OutputStream os;
        try {
            os = new FileOutputStream(imageFile);
            bit.compress(Bitmap.CompressFormat.PNG, 100, os); 
            os.flush();
            os.close();
        } catch (Exception e) {
            Log.e(getClass().getSimpleName(), "Error writing bitmap", e);
        }

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        Uri imageUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, imageFile);

        intent.putExtra(Intent.EXTRA_STREAM, imageUri);
        intent.setType("image/*");
        context.startActivity(intent);
    }
});

अधिक विस्तृत विवरण के लिए https://droidlytics.wordpress.com/2020/08/04/use-fileprovider-to-share-image-from-recyclerview/ पर जाएँ


1

कड़ी सुरक्षा नीतियों के क्रियान्वयन के साथ, ऐप के बाहर यूआरआई को उजागर करने से एक त्रुटि और एप्लिकेशन क्रैश हो जाता है।

@ एली तमूर का जवाब फ़ाइल प्रोवाइडर्स का उपयोग करके बताता है, यह अनुशंसित तरीका है।

अधिक जानकारी के लिए देखें - https://developer.android.com/training/secure-file-sharing/setup-haring

इसके अलावा आपको अपने प्रोजेक्ट में androidx कोर लाइब्रेरी शामिल करने की आवश्यकता है।

implementation "androidx.core:core:1.2.0"

बेशक यह थोड़ा भारी पुस्तकालय है और इसे सिर्फ फाइलों को साझा करने के लिए चाहिए - अगर कोई बेहतर तरीका है तो कृपया मुझे बताएं।


0
Strring temp="facebook",temp="whatsapp",temp="instagram",temp="googleplus",temp="share";

    if(temp.equals("facebook"))
    {
        Intent intent = getPackageManager().getLaunchIntentForPackage("com.facebook.katana");
        if (intent != null) {

            Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
            shareIntent.setType("image/png");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + "/sdcard/folder name/abc.png"));
            shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            shareIntent.setPackage("com.facebook.katana");
            startActivity(shareIntent);

        }
        else
        {
            Toast.makeText(MainActivity.this, "Facebook require..!!", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals("whatsapp"))
    {

        try {
            File filePath = new File("/sdcard/folder name/abc.png");
            final ComponentName name = new ComponentName("com.whatsapp", "com.whatsapp.ContactPicker");
            Intent oShareIntent = new Intent();
            oShareIntent.setComponent(name);
            oShareIntent.setType("text/plain");
            oShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Website : www.google.com");
            oShareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(filePath));
            oShareIntent.setType("image/jpeg");
            oShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            MainActivity.this.startActivity(oShareIntent);


        } catch (Exception e) {
            Toast.makeText(MainActivity.this, "WhatsApp require..!!", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals("instagram"))
    {
        Intent intent = getPackageManager().getLaunchIntentForPackage("com.instagram.android");
        if (intent != null)
        {
            File filePath =new File("/sdcard/folder name/"abc.png");
            Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
            shareIntent.setType("image");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + "/sdcard/Chitranagari/abc.png"));
            shareIntent.setPackage("com.instagram.android");
            startActivity(shareIntent);

        }
        else
        {
            Toast.makeText(MainActivity.this, "Instagram require..!!", Toast.LENGTH_SHORT).show();

        }
    }
    if(temp.equals("googleplus"))
    {

        try
        {

            Calendar c = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
            String strDate = sdf.format(c.getTime());
            Intent shareIntent = ShareCompat.IntentBuilder.from(MainActivity.this).getIntent();
            shareIntent.setType("text/plain");
            shareIntent.putExtra(Intent.EXTRA_TEXT, "Website : www.google.com");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + "/sdcard/folder name/abc.png"));
            shareIntent.setPackage("com.google.android.apps.plus");
            shareIntent.setAction(Intent.ACTION_SEND);
            startActivity(shareIntent);
        }catch (Exception e)
        {
            e.printStackTrace();
            Toast.makeText(MainActivity.this, "Googleplus require..!!", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals("share")) {

        File filePath =new File("/sdcard/folder name/abc.png");  //optional //internal storage
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, "Website : www.google.com");
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(filePath));  //optional//use this when you want to send an image
        shareIntent.setType("image/jpeg");
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(Intent.createChooser(shareIntent, "send"));

    }

0
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
            Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        Log.d(TAG, "Permission granted");
    } else {
        ActivityCompat.requestPermissions(getActivity(),
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                100);
    }

    fab.setOnClickListener(v -> {
        Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.refer_pic);
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("image/*");
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        b.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(requireActivity().getContentResolver(),
                b, "Title", null);
        Uri imageUri = Uri.parse(path);
        share.putExtra(Intent.EXTRA_STREAM, imageUri);
        share.putExtra(Intent.EXTRA_TEXT, "Here is text");
        startActivity(Intent.createChooser(share, "Share via"));
    });

नमस्कार और एसओ में आपका स्वागत है! हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है ताकि उत्तर के दीर्घकालिक मूल्य में सुधार हो सके। कृपया दौरा पढ़ें , और मैं एक अच्छा उत्तर कैसे लिखूं? आप जानकारी जोड़ सकते हैं कि इस प्रश्न के अन्य उत्तरों से बेहतर क्यों है।
तोमर शेटह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.