Как поделиться изображением изображения?

У меня есть ImageView, и я хочу поделиться своим изображением.

Ниже приведен мой код,

btshare.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

                 View content = findViewById(R.id.full_image_view);
                 content.setDrawingCacheEnabled(true);
                     Bitmap bitmap = content.getDrawingCache();
                     File root = Environment.getExternalStorageDirectory();
                     File cachePath = new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg");
                     try 
                     {
                         root.createNewFile();
                         FileOutputStream ostream = new FileOutputStream(root);
                         bitmap.compress(CompressFormat.JPEG, 100, ostream);
                         ostream.close();
                     } 
                     catch (Exception e) 
                     {
                         e.printStackTrace();
                     }


                 Intent shareIntent = new Intent(Intent.ACTION_SEND);
                 Uri phototUri = Uri.parse("/DCIM/Camera/image.jpg");
                 shareIntent.setData(phototUri);
                 shareIntent.setType("image/*");
                 shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri);
                 startActivity(Intent.createChooser(shareIntent, "Share Via"));

             }  



    });

когда я нажимаю кнопку, я получаю эти ошибки?

01-13 06:00:19.282: W/System.err(6199): java.io.FileNotFoundException: /storage/emulated/0: open failed: EISDIR (Is a directory)
01-13 06:00:19.286: W/System.err(6199):     at libcore.io.IoBridge.open(IoBridge.java:409)
01-13 06:00:19.286: W/System.err(6199):     at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
01-13 06:00:19.294: W/System.err(6199):     at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
01-13 06:00:19.294: W/System.err(6199):     at com.safshari.mandegar.FullImageActivity$3.onClick(FullImageActivity.java:116)
01-13 06:00:19.294: W/System.err(6199):     at android.view.View.performClick(View.java:4240)
01-13 06:00:19.294: W/System.err(6199):     at android.view.View$PerformClick.run(View.java:17721)
01-13 06:00:19.298: W/System.err(6199):     at android.os.Handler.handleCallback(Handler.java:730)
01-13 06:00:19.298: W/System.err(6199):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-13 06:00:19.298: W/System.err(6199):     at android.os.Looper.loop(Looper.java:137)
01-13 06:00:19.302: W/System.err(6199):     at android.app.ActivityThread.main(ActivityThread.java:5103)
01-13 06:00:19.302: W/System.err(6199):     at java.lang.reflect.Method.invokeNative(Native Method)
01-13 06:00:19.302: W/System.err(6199):     at java.lang.reflect.Method.invoke(Method.java:525)
01-13 06:00:19.302: W/System.err(6199):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-13 06:00:19.306: W/System.err(6199):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-13 06:00:19.306: W/System.err(6199):     at dalvik.system.NativeStart.main(Native Method)
01-13 06:00:19.310: W/System.err(6199): Caused by: libcore.io.ErrnoException: open failed: EISDIR (Is a directory)
01-13 06:00:19.310: W/System.err(6199):     at libcore.io.Posix.open(Native Method)
01-13 06:00:19.310: W/System.err(6199):     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
01-13 06:00:19.310: W/System.err(6199):     at libcore.io.IoBridge.open(IoBridge.java:393)
01-13 06:00:19.314: W/System.err(6199):     ... 14 more
01-13 06:00:19.618: E/Genymotion(489): Could not open '/sys/class/power_supply/genymotion_fake_path/present'

что мне делать и какие разрешения нужны моей программе? Я уже объявил следующие разрешения,

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

person Soheyl    schedule 13.01.2014    source источник


Ответы (6)


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

    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("image/*");
    share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg"));
    startActivity(Intent.createChooser(share,"Share via"));

Добавьте эти разрешения в AndroidMenifest.xml

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
person Zankhna    schedule 13.01.2014
comment
Если это решит вашу проблему, не забудьте отметить это как правильный ответ. - person Zankhna; 13.01.2014
comment
зачем мне разрешение камеры? @zanky - person Soheyl; 13.01.2014
comment
не работает с этими тремя разрешениями и кодом сверху. через блютуз ничего не происходит, а через другие программы пишет неверный файл - person Soheyl; 13.01.2014
comment
также у меня есть предупреждение в этой строке, в котором говорится, что cachepath никогда не использовался File cachePath = new File(root.getAbsolutePath() + /DCIM/Camera/image.jpg); - person Soheyl; 13.01.2014
comment
01-13 10:32:44.381: D/AbsListView(12194): unregisterIRListener() вызывается 01-13 10:32:45.066: D/AbsListView(12194): onDetachedFromWindow 01-13 10:32:45.066: D/AbsListView (12194): unregisterIRListener() называется @zanky - person Soheyl; 13.01.2014
comment
этот код работает для меня. Действительно ли ваше изображение сохранено на устройстве? - person Zankhna; 13.01.2014
comment
нет, я исправил верхнюю часть, и теперь она сохраняется, но не делится, но изображение отлично сохраняется. Верхняя часть: - person Soheyl; 13.01.2014
comment
code content.setDrawingCacheEnabled(true); Растровое изображение = content.getDrawingCache(); Корень файла = Environment.getExternalStorageDirectory(); File cachePath = new File(root.getAbsolutePath() + /DCIM/Camera/image.jpg); попробуйте { cachePath.createNewFile(); FileOutputStream ostream = новый FileOutputStream(cachePath); bitmap.compress(CompressFormat.JPEG, 100, ostream); ostream.close(); } catch (Исключение e) { e.printStackTrace(); } }code - person Soheyl; 13.01.2014
comment
Хорошо .. так что теперь он делится изображением? И вместо того, чтобы писать рабочий код в комментарии, отредактируйте свой код с помощью этого кода. Это поможет другим. - person Zankhna; 16.01.2014
comment
При этом используется локальный путь к файлу, а не ImageView. - person Michael Peterson; 02.10.2017

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

View content = findViewById(R.id.full_image_view);
                 content.setDrawingCacheEnabled(true);

                     Bitmap bitmap = content.getDrawingCache();
                     File root = Environment.getExternalStorageDirectory();
                     File cachePath = new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg");
                     try {
                         cachePath.createNewFile();
                         FileOutputStream ostream = new FileOutputStream(cachePath);
                         bitmap.compress(CompressFormat.JPEG, 100, ostream);
                         ostream.close();
                     } catch (Exception e) {
                         e.printStackTrace();
                     }


                     Intent share = new Intent(Intent.ACTION_SEND);
                     share.setType("image/*");
                     share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(cachePath));
                     startActivity(Intent.createChooser(share,"Share via"));

             }  

счастливое кодирование

person Soheyl    schedule 13.01.2014
comment
Могу ли я поделиться из изображения, а не из файла / URL-адреса? - person bashan; 03.11.2017
comment
Спасибо, но это не работает. Я получаю: java.io.IOException: нет такого файла или каталога. - person bashan; 03.11.2017

Вам нужно добавить это разрешение

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
person Aditya Kamath    schedule 13.01.2014

попробуйте сначала создать кеш для хранения этого изображения, а затем поделиться им, потому что вы можете делиться только общедоступными изображениями с другими приложениями. Вы не можете делиться содержимым, которое является частным для вашего приложения.

используйте Context.getExternalCacheDir() для создания кеша, а затем поделитесь содержимым этого кеша

person Community    schedule 13.01.2014

  • получить растровое изображение из изображения
imageview.buildDrawingCache();
Bitmap image = mainimg.getDrawingCache();
  • конвертировать URL
public Uri getImageUri(Context inContext, Bitmap inImage) {
  ByteArrayOutputStream bytes = new ByteArrayOutputStream();
  inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
  String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
  return Uri.parse(path);
}
  • затем кнопка поделиться
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/*");
share.putExtra(Intent.EXTRA_STREAM, getImageUri(this,getImageUri));
startActivity(Intent.createChooser(share,"Share via"));
person project zcore    schedule 30.03.2020

person    schedule
comment
как поделиться изображением через намерение - person Be Coool; 10.10.2018