Как сохранить изображение imageView в галерее (разработка Android)

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

    sharebtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View b) {
            // TODO Auto-generated method stub
            //attempt to save the image

            b = findViewById(R.id.imageView);
            b.setDrawingCacheEnabled(true);
                Bitmap bitmap = b.getDrawingCache();
                //File file = new File("/DCIM/Camera/image.jpg");
                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();
                }

        }
    });

person ShenJie Lin    schedule 13.03.2013    source источник
comment
у вас есть разрешение на запись в вашем файле манифеста.   -  person Raghunandan    schedule 13.03.2013


Ответы (5)


Я делаю это, чтобы сохранить изображение в галерее.

private void saveImageToGallery(){
    imageview.setDrawingCacheEnabled(true);
    Bitmap b = imageview.getDrawingCache();
    Images.Media.insertImage(getActivity().getContentResolver(), b,title, description);
}

insertImage() вернет String != null, если изображение действительно было сохранено. Также: требуется разрешение в манифесте как «android.permission.WRITE_EXTERNAL_STORAGE». Обратите внимание, что это помещает изображение в конец списка изображений, уже находящихся в галерее.

Надеюсь это поможет.

person Sergio Carvalho    schedule 28.06.2013
comment
Каким-либо образом вы можете сделать так, чтобы он отображался в верхней части списка изображений? - person Alan Ford; 29.12.2014
comment
Да, я использую трюк, предоставленный samkirton. см. здесь. Это работает очень хорошо - person Sergio Carvalho; 08.01.2015
comment
setDrawingCacheEnabled устарел - person Amin Pinjari; 14.09.2019

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

imageView.buildDrawingCache();
Bitmap bm=imageView.getDrawingCache();

Затем сохраните его с кодом ниже: -

MediaStore.Images.Media.insertImage(getContentResolver(), yourBitmap, yourTitle , yourDescription);

И не забудьте установить это разрешение в своем манифесте: -

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
person cathy.s    schedule 20.04.2017
comment
мне нужно поставить расширение в заголовке? - person Ashish; 24.11.2018
comment
Это, безусловно, лучшее решение, которое мне удалось найти, но похоже, что оно требует разрешения в режиме реального времени, иначе оно не работает. Тем, кто ищет аналогичный метод, я предлагаю добавить код, доступный здесь, прежде чем внедрять это решение. - person JorgeAmVF; 14.12.2018

Вы должны сохранить изображение в медиа-провайдере. Вот простой пример:

Uri saveMediaEntry(String imagePath,String title,String description,long dateTaken,int orientation,Location loc) {
ContentValues v = new ContentValues();
v.put(Images.Media.TITLE, title);
v.put(Images.Media.DISPLAY_NAME, displayName);
v.put(Images.Media.DESCRIPTION, description);
v.put(Images.Media.DATE_ADDED, dateTaken);
v.put(Images.Media.DATE_TAKEN, dateTaken);
v.put(Images.Media.DATE_MODIFIED, dateTaken) ;
v.put(Images.Media.MIME_TYPE, “image/jpeg”);
v.put(Images.Media.ORIENTATION, orientation);
File f = new File(imagePath) ;
File parent = f.getParentFile() ;
String path = parent.toString().toLowerCase() ;
String name = parent.getName().toLowerCase() ;
v.put(Images.ImageColumns.BUCKET_ID, path.hashCode());
v.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, name);
v.put(Images.Media.SIZE,f.length()) ;
f = null ;
if( targ_loc != null ) {
v.put(Images.Media.LATITUDE, loc.getLatitude());
v.put(Images.Media.LONGITUDE, loc.getLongitude());
}
v.put(“_data”,imagePath) ;
ContentResolver c = getContentResolver() ;
return c.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, v);
}
person Justin Vartanian    schedule 13.03.2013

private void galleryAddPic() {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File f = new File(mCurrentPhotoPath);
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
}

Проверьте это: http://developer.android.com/training/camera/photobasics.html#TaskGallery

person hrules6872    schedule 25.07.2013

person    schedule
comment
Вы в основном скопировали код в ответе другого человека, но не включили никаких объяснений того, почему ваш ответ может работать. - person Andrew Barber; 25.08.2014