Android Intent Share, используя внешний URL-адрес изображения

Я не мог не заметить, что все примеры обмена изображениями с помощью Intent используют локально сохраненные файлы. Всякий раз, когда я пытаюсь использовать внешний url, facebook, twitter и т. Д., Я могу сказать тост: «Один или несколько элементов мультимедиа не могут быть добавлены».

Должен ли я хранить копию изображения локально? Если да, как это сделать?

Solutions Collecting From Web of "Android Intent Share, используя внешний URL-адрес изображения"

Спасибо @ user2245247 за ссылку
Он содержит правильный ответ для совместного использования изображения с удаленного URL-адреса.
Использовать внешнюю библиотеку

// Get access to ImageView ImageView ivImage = (ImageView) findViewById(R.id.ivResult); // Fire async request to load image Picasso.with(context).load(imageUrl).into(ivImage); 

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

 // Can be triggered by a view event such as a button press public void onShareItem(View v) { // Get access to bitmap image from view ImageView ivImage = (ImageView) findViewById(R.id.ivResult); // Get access to the URI for the bitmap Uri bmpUri = getLocalBitmapUri(ivImage); if (bmpUri != null) { // Construct a ShareIntent with link to image Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri); shareIntent.setType("image/*"); // Launch sharing dialog for image startActivity(Intent.createChooser(shareIntent, "Share Image")); } else { // ...sharing failed, handle error } } // Returns the URI path to the Bitmap displayed in specified ImageView public Uri getLocalBitmapUri(ImageView imageView) { // Extract Bitmap from ImageView drawable Drawable drawable = imageView.getDrawable(); Bitmap bmp = null; if (drawable instanceof BitmapDrawable){ bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); } else { return null; } // Store image to default external storage directory Uri bmpUri = null; try { File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS), "share_image_" + System.currentTimeMillis() + ".png"); file.getParentFile().mkdirs(); FileOutputStream out = new FileOutputStream(file); bmp.compress(Bitmap.CompressFormat.PNG, 90, out); out.close(); bmpUri = Uri.fromFile(file); } catch (IOException e) { e.printStackTrace(); } return bmpUri; } 

Убедитесь, что у вас есть следующие разрешения.

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

Вот как вы можете поделиться ссылкой:

 Intent intent = new Intent(Intent.ACTION_SEND); Uri uri = Uri.parse("http://linkto.com/your_image.png"); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_STREAM, String.valueOf(uri)); startActivity(intent); 

Возможные решения: совместное использование контента с намерениями

Другим альтернативным способом достижения этого с использованием метода из предыдущего ответа является:

 Picasso.with(this).load(imageurl).into(shareTarget); private Target shareTarget = new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { // Get access to the URI for the bitmap Uri bmpUri = getLocalBitmapUri(bitmap); if (bmpUri != null) { // Construct a ShareIntent with link to image Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_text)); shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri); shareIntent.setType("image/*"); // Launch sharing dialog for image startActivity(Intent.createChooser(shareIntent, "Share Image")); } else { // ...sharing failed, handle error } } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }; public Uri getLocalBitmapUri(Bitmap bmp) { // Store image to default external storage directory Uri bmpUri = null; try { File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS), "share_image_" + System.currentTimeMillis() + ".png"); file.getParentFile().mkdirs(); FileOutputStream out = new FileOutputStream(file); bmp.compress(Bitmap.CompressFormat.PNG, 90, out); out.close(); bmpUri = Uri.fromFile(file); } catch (IOException e) { e.printStackTrace(); } return bmpUri; }