it-roy-ru.com

Как использовать "Поделиться изображением с помощью" обмена Намерение поделиться изображениями в Android?

В этом приложении у меня есть приложение для отображения изображений, я поместил все изображения в папку 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"));  

         }
    });

Если не возражаете, кто-нибудь, пожалуйста, исправьте мой код OR, приведите правильный пример. Как мне поделиться своими изображениями из папки drawable-hdpi? 

66
Abhijeet
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"));
106
superM

Предложенное компанией 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"));
37
Sebastian Hojas

Сначала добавьте разрешение

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

использовать Bitmap из res

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

Проверено через Bluetooth и другие мессенджеры

Работает как Шарм.

20
Hemant Shori

Я нашел самый простой способ сделать это с помощью 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"));

От: Совместное использование контента с намерениями

14
Kukiwon

Как программно обмениваться изображениями в Android. Иногда вы хотите сделать снимок своего представления, а затем хотите поделиться им поэтому выполните следующие действия: 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();
    }

}
11
Najaf Ali

Простой и простой код вы можете использовать его, чтобы поделиться изображением из галереи.

 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 );
11
SANJAY GUPTA

Вот решение, которое сработало для меня. Одно замечание: вам нужно хранить изображения в общедоступном или не принадлежащем приложению частном месте ( http://developer.Android.com/guide/topics/data/data-storage.html#InternalCache )

Во многих предложениях говорится о том, чтобы хранить в «приватном» кеше Apps, но это, конечно, недоступно через другие внешние приложения, включая общее намерение Share File, которое используется. Когда вы попробуете это, он запустится, но, например, dropbox скажет вам, что файл больше не доступен.

/ * ШАГ 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");
        }


    }   

Я надеюсь, что это помогает кому-то.

10
wired00

Я устал искать разные варианты для обмена видом или изображением из моего приложения в другое приложение. И наконец я получил решение. 

Шаг 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);
}
7
AshisParajuli

У меня просто была такая же проблема. 
Вот ответ, который не использует явную запись файла в вашем основном коде (позволяя 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 объект .. В моем случае (код выше), Drawable был извлечен из ImageView.

3
vianna77

Ответ SuperM работал для меня, но с Uri.fromFile () вместо Uri.parse ().

С Uri.parse () он работал только с WhatsApp.

Это мой код: 

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

Вывод Uri.parse ():
/Хранение/эмулировать/0/Android/данные/application_package/Files/17072015_0927.jpg

Вывод Uri.fromFile:
.__ файл:. ///Storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg

3
cgr

ссылка: - 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.."));
3
Bikesh M Annur

попробуй это,

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"));
2
Ganpat Kaliya

Идеальное решение для обмена текстом и изображениями через Intent - это:

Нажмите на кнопку «Поделиться»:

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 (изображение).

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

}

А потом просто проверить это .. !!

1
Devangi
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
hardip

Все вышеперечисленное решение не работает для меня в Android Api 26 & 27 (Oreo), было получение Error: exposed beyond app through ClipData.Item.getUri. Решение, которое подходит в моей ситуации, было 

  1. получить путь URI, используя 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`
0
Ali Tamoor

Сначала , вы должны объявить этого FileProvider в вашем файле AndroidManifest.xml внутри тега <application>:

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

Во-вторых , создайте XML-файл fileprovider.xml в каталоге xml:

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

Наконец, делайте код программно и делитесь Uri с вашим целевым приложением:

//  --------------------------  Share Image  -----------------------
private void shareImage() {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");

    intent.putExtra(Intent.EXTRA_STREAM, getShareUri());
    startActivity(Intent.createChooser(intent, "Share image using"));
}

private Uri getShareUri(){
    try {
        File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "share_image_" + System.currentTimeMillis() + ".png");
        if (file.createNewFile()) {
            FileChannel source = new FileInputStream(currentFile).getChannel();  // currentFile After edit image current sate
            FileChannel destination = new FileOutputStream(file).getChannel();

            destination.transferFrom(source, 0, source.size());
            source.close();
            destination.close();
        }

        sharedFileUri = FileProvider.getUriForFile(this, "com.appsuite.fileprovider", file);
        return sharedFileUri;

    }catch (Exception e){
        Log.e(TAG, "shareImage: error - " + e.getMessage(), e);
        return null;
    }
}

Я пробовал это, и он отлично работает с API 19 до 28.

0
Hasib Akter