Как использовать «Поделиться изображением с помощью» обмена Намерение поделиться изображениями в Android? - PullRequest
69 голосов
/ 05 октября 2011

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

Ответы [ 15 ]

109 голосов
/ 05 октября 2011
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"));
37 голосов
/ 27 октября 2013

Предложенное компанией 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"));
21 голосов
/ 07 мая 2015

Первое разрешение на добавление

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

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

Работает как Очарование.

16 голосов
/ 18 сентября 2015

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

От: Обмен содержимым с содержимым

11 голосов
/ 15 марта 2017

Как программно обмениваться изображениями в 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 голосов
/ 07 марта 2016

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

 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 );
10 голосов
/ 06 февраля 2014

Вот решение, которое сработало для меня. Один момент: вам нужно хранить изображения в общедоступном или не принадлежащем приложению приватном месте (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");
        }


    }   

Надеюсь, это кому-нибудь поможет.

7 голосов
/ 16 августа 2016

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

Шаг 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);
}
3 голосов
/ 02 декабря 2015

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.."));
3 голосов
/ 18 сентября 2015

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

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