Android에서 이미지를 공유하기 위해 "Share image using"공유 의도를 사용하는 방법은 무엇입니까?


80

그 앱에 이미지 갤러리 앱이 있습니다. 모든 이미지를 drawable-hdpi 폴더에 넣었습니다. 내 활동에서 이미지를 다음과 같이 호출했습니다.

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"));  

         }
    });

누군가가 위의 코드를 수정하거나 적절한 예제를 제공해도 괜찮다면 drawable-hdpi 폴더에서 내 이미지를 어떻게 공유합니까?


전체 배열을 URI 구문 분석 방법으로 전달합니다
Pratik

잘못된 URI를 설정하고 있습니다. 이것이이 문제가 발생하는 이유입니다. 다시 당신은 당신이 사용해야합니다 여러 개의 이미지를 공유하려는 stackoverflow.com/questions/2264622/...을 .. 그리고 올바른 URI를 설정하는 당신은 시도해야 stackoverflow.com/questions/6602417/...을
Kartik Domadiya


이 튜토리얼 확인 당김 폴더 공유 이미지
Vaishakh

답변:


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 2013-06-16

7
또한 출력 스트림을 닫아야합니다.
Maarten

2
@superM 유 내가 당김 폴더에서 공유 할 수있는 방법 나를 도울 수
Erum

7
1.) FileOutputStream을 닫는 것을 잊지 마십시오. 2.) "/ sdcard /"를 하드 코딩하지 마십시오. 대신 Environment.getExternalStorageDirectory (). getPath () 사용
linuxjava

41

superM에서 제안한 솔루션은 오랫동안 저에게 효과적 이었지만 최근에는 4.2 (HTC One)에서 테스트 한 후 작동을 멈췄습니다. 이것이 해결 방법이라는 것을 알고 있지만 모든 장치 및 버전에서 나를 위해 일한 유일한 방법이었습니다.

문서에 따르면 개발자는 "MediaStore 시스템 사용"을 요청받습니다. 바이너리 콘텐츠를 보내기 위해 . 그러나 이것은 미디어 콘텐츠가 장치에 영구적으로 저장된다는 (단점) 단점이 있습니다.

이것이 귀하를위한 옵션 인 경우 권한을 부여 WRITE_EXTERNAL_STORAGE하고 시스템 전체의 MediaStore를 사용할 수 있습니다.

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
이것이 제가 Facebook에서 공유 할 수 있었던 유일한 솔루션입니다! 감사.
Moti Bartov 2015

9
이것은 새로운 이미지를 생성합니다. 새 이미지를 어떻게 삭제합니까?
BlueMango

2
@BlueMango 솔루션을 찾았습니까?
aks

완벽한 대답! 모든 앱에서 작동합니다!
dianakarenms

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"));

블루투스 및 기타 메신저를 통해 테스트


앱과 모든 것 같은 URL에서 이미지를 보내는 방법
Harsha

URL에서 다른 앱으로 이미지를 공유하려는 경우 이미지를 Bitmap stackoverflow.com/questions/18210700/… 에 다운로드 한 다음 공유 의도를 사용해야합니다.
Hemant Shori

이미지를 첨부하고 그 앱을 닫고 우리 앱으로 이동하는 방법을 공유 한 후 android
Harsha

1
@Harsha 롤. 참고로, 누군가가 앱을 떠나면 어떻게 처리 할 수 ​​없습니다. 그 / 그녀는 최근에 가서 당신의 앱을 다시 시작해야합니다. 다른 방법은 없습니다. 다른 사람의 앱을 어떻게 제어 할 수 있습니까?.
Hemant Shori


20

이 작업을 수행하는 가장 쉬운 방법은 MediaStore를 사용하여 공유하려는 이미지를 임시로 저장하는 것입니다.

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"));

From : 인 텐트로 콘텐츠 공유


canvas변수 가 필요 하지 않으며 어디에도 사용되지 않습니다.
페르난도 M. 핀 헤이

2
manifest.xml에 오류를 추가하는 것을 잊지 마십시오 : <uses-permission android : name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
Hamid

13

Android에서 이미지를 progamatically 공유하는 방법 때로는 뷰의 스냅 샷을 찍고 공유하고 싶으므로 다음 단계를 따르십시오. 1. mainfest 파일에 권한 추가

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

2. 매우 먼저보기의 스크린 샷을 찍습니다. 예를 들어 Imageview, Textview, Framelayout, LinearLayout 등입니다.

예를 들어 oncreate ()에서이 메서드를 호출하여 스크린 샷을 찍을 이미지보기가 있습니다.

 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);"는 무엇입니까? 위에서 설정 한 의도에 사용 되었습니까?
AJW

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 );

간단하고 강력하며 이미지를 저장할 필요가 없습니다. 위의 모든 답변이 저에게 효과가 없었지만이 간단한 솔루션이 트릭을 수행합니다 ... 정말 감사합니다 .... 그런데이 코드를 내 안드로이드의 오레오 버전 전화
Parsania Hardik

10

다음은 나를 위해 일한 솔루션입니다. 한 가지 문제는 공유 또는 비 앱 비공개 위치 ( http://developer.android.com/guide/topics/data/data-storage.html#InternalCache )에 이미지를 저장해야한다는 것입니다.

많은 제안이 Apps"비공개"캐시 위치 에 저장하라고 말하고 있지만 이것은 물론 사용되는 일반 공유 파일 의도를 포함하여 다른 외부 응용 프로그램을 통해 액세스 할 수 없습니다. 이를 시도하면 실행되지만 예를 들어 dropbox는 파일을 더 이상 사용할 수 없다고 알려줍니다.

/ * STEP 1-아래 파일 저장 기능을 사용하여 비트 맵 파일을 로컬에 저장합니다. * /

localAbsoluteFilePath = saveImageLocally(bitmapImage);

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

/ * 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에 적합하도록 예제를 변경할 때 오타를 작성해야합니다. 건배
wired00


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

나는 단지 같은 문제가 있었다.
다음은 기본 코드에 명시적인 파일 작성을 사용하지 않는 답변입니다 (API가 자동으로 처리하도록 함).

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"));

이것이 경로입니다. Drawable 개체에 이미지 ID를 추가하기 만하면됩니다. 필자의 경우 (위의 코드) 드로어 블은 ImageView에서 추출되었습니다.


3

SuperM 대답은 나를 위해 일했지만 Uri.parse () 대신 Uri.fromFile ()을 사용했습니다.

Uri.parse ()를 사용하면 Whatsapp에서만 작동했습니다.

이것은 내 코드입니다.

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

Uri.parse ()의 출력 :
/storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg

Uri.fromFile의 출력 :
file : ///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

ref :-http: //developer.android.com/training/sharing/send.html#send-multiple-content

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);
        }
    });

그런 다음 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)as를 사용하여 경로 uri 가져 오기
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

감사합니다. 주어진 옵션 중 몇 가지를 시도했지만 최신 Android 릴리스에서는 작동하지 않는 것 같습니다. 따라서 최신 Android 릴리스에서 작동하는 수정 된 단계를 추가하십시오. 위의 답변 중 몇 가지를 기반으로하지만 수정 및 솔루션은 파일 공급자 사용을 기반으로합니다.

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 파일을 만듭니다.

이것은 이전 단계에서 android : resource에 포함 된 파일입니다.

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

더 엄격한 보안 정책을 구현하면 앱 외부에 uri를 노출하면 오류가 발생하고 애플리케이션이 충돌합니다.

@Ali Tamoor의 답변은 파일 공급자 사용에 대해 설명하며 이것이 권장되는 방법입니다.

자세한 내용은 https://developer.android.com/training/secure-file-sharing/setup-sharing을 참조 하십시오.

또한 프로젝트에 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"));
    });

안녕하세요, SO에 오신 것을 환영합니다! 이 코드가 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다. 읽기 바랍니다 투어를 하고, 어떻게 내가 좋은 답변을 작성하려면 어떻게해야합니까? 이 질문에 대한 답변이 다른 답변보다 더 나은 이유에 대한 정보를 추가 할 수 있습니다.
Tomer Shetah
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.