精华内容
下载资源
问答
  • 安卓保存图片到相册

    2016-04-19 18:16:11
    安卓保存图片到相册 最近的需求是做一个保存图片的功能,即长按图片弹出保存图片的选项,然后点击图片进行保存。长按图片的下拉框显示可以使用ActionSheetDialog,这个是类似iOS的列表框,可以网上找资源下载...

    安卓保存图片到相册


    最近的需求是做一个保存图片的功能,即长按图片弹出保存图片的选项,然后点击图片进行保存。长按图片的下拉框显示可以使用ActionSheetDialog,这个是类似iOS的列表框,可以网上找资源下载下来。挺简单挺实用的。下面就来具体说下如何保存图片到相册:


    Adnroid中保存图片的方法可能有如下两种:

    第一种是自己写方法,如下代码:

    public static File saveImage(Bitmap bmp) {

        File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");

        if (!appDir.exists()) {

            appDir.mkdir();

        }

        String fileName = System.currentTimeMillis() + ".jpg";

        File file = new File(appDir, fileName);

        try {

            FileOutputStream fos = new FileOutputStream(file);

            bmp.compress(CompressFormat.JPEG, 100, fos);

            fos.flush();

            fos.close();

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    以上代码便是将Bitmap保存图片到指定的路径/sdcard/Boohee/下,文件名以当前系统时间命名,但是这种方法保存的图片没有加入到系统图库中


    第二种是调用系统提供的插入图库的方法:

    MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "title", "description");

    调用以上系统自带的方法会把bitmap对象保存到系统图库中,但是这种方法无法指定保存的路径和名称,上述方法的title、description参数只是插入数据库中的字段,真实的图片名称系统会自动分配。


    看似上述第二种方法就是我们要用到的方法,但是可惜的调用上述第二种插入图库的方法图片并没有立刻显示在图库中,而我们需要立刻更新系统图库以便让用户可以立刻查看到这张图片。

    更新系统图库的方法

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));


    上面那条广播是扫描整个sd卡的广播,如果你sd卡里面东西很多会扫描很久,在扫描当中我们是不能访问sd卡,所以这样子用户体现很不好,所以下面我们还有如下的方法:

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("/sdcard/Boohee/image.jpg"))););


    或者还有如下方法:

    final MediaScannerConnection msc = new MediaScannerConnection(mContext, new MediaScannerConnectionClient() {     
        public void onMediaScannerConnected() {     
            msc.scanFile("/sdcard/Boohee/image.jpg", "image/jpeg");     
        }     
        public void onScanCompleted(String path, Uri uri) {     
            Log.v(TAG, "scan completed");     
            msc.disconnect();     
        }     

    });


    上面代码的图片路径不管是通过自己写方法还是系统插入图库的方法都可以很容易的获取到。

    终极完美解决方案:

    那么到这里可能有人又会问了,如果我想把图片保存到指定的文件夹,同时又需要图片出现在图库里呢?答案是可以的,sdk还提供了这样一个方法:

    MediaStore.Images.Media.insertImage(getContentResolver(), "image path", "title", "description");


    上述方法的第二个参数是image path,这样的话就有思路了,首先自己写方法把图片指定到指定的文件夹,然后调用上述方法把刚保存的图片路径传入进去,最后通知图库更新。

    所以写了一个方法,完整的代码如下:


    public static void saveImageToGallery(Context context, Bitmap bmp) {

        // 首先保存图片

        File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");

        if (!appDir.exists()) {

            appDir.mkdir();

        }

        String fileName = System.currentTimeMillis() + ".jpg";

        File file = new File(appDir, fileName);

        try {

            FileOutputStream fos = new FileOutputStream(file);

            bmp.compress(CompressFormat.JPEG, 100, fos);

            fos.flush();

            fos.close();

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

    }
        

        // 其次把文件插入到系统图库

        try {

            MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(), fileName, null);

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        }

        // 最后通知图库更新

        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(file.getPath()))));

    }


    补充:

    今天在看系统截图源码的时候,里面也有保存屏幕截图到系统图库的代码,如下

    Context context = params[0].context;

            Bitmap image = params[0].image;

            Resources r = context.getResources();

            try {

                // Create screenshot directory if it doesn't exist

                mScreenshotDir.mkdirs();

                // media provider uses seconds for DATE_MODIFIED and DATE_ADDED, but milliseconds

                // for DATE_TAKEN

                long dateSeconds = mImageTime / 1000;


                // Save the screenshot to the MediaStore

                ContentValues values = new ContentValues();

                ContentResolver resolver = context.getContentResolver();

                values.put(MediaStore.Images.ImageColumns.DATA, mImageFilePath);

                values.put(MediaStore.Images.ImageColumns.TITLE, mImageFileName);

                values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, mImageFileName);

                values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, mImageTime);

                values.put(MediaStore.Images.ImageColumns.DATE_ADDED, dateSeconds);

                values.put(MediaStore.Images.ImageColumns.DATE_MODIFIED, dateSeconds);

                values.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/png");

                values.put(MediaStore.Images.ImageColumns.WIDTH, mImageWidth);

                values.put(MediaStore.Images.ImageColumns.HEIGHT, mImageHeight);

                Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);


                OutputStream out = resolver.openOutputStream(uri);

                image.compress(Bitmap.CompressFormat.PNG, 100, out);

                out.flush();

                out.close();

                // update file size in the database

                values.clear();

                values.put(MediaStore.Images.ImageColumns.SIZE, new File(mImageFilePath).length());

                resolver.update(uri, values, null, null);

               
            } catch (Exception e) {
               

            }


        转载自:->http://stormzhang.github.io/android/2014/07/24/android-save-image-to-gallery/




    展开全文
  • 安卓保存网络图片并通知图库更新最近有个需求刚好是这个,但是发现网络图片保存到手机后图库并没有及时刷新出来,捣鼓了一上午终于搞出来了废话不说直接上代码: 首先是写个异步请求网络图片// 异步任务 直接传图片...

    安卓保存网络图片并通知图库更新

    最近有个需求刚好是这个,但是发现网络图片保存到手机后图库并没有及时刷新出来,捣鼓了一上午终于搞出来了


    废话不说直接上代码:
    首先是写个异步请求网络图片

    //  异步任务  直接传图片地址
        public void addTask(String url) {
            new AsyncTask<String, Void, Bitmap>() {
                @Override
                protected Bitmap doInBackground(String... params) {
                    // 后台通信  
                    return decodeBitmap(params[0]);
                }
    
                @Override
                protected void onPostExecute(Bitmap bitmap) {
                    // 主线程处理view
                    if (bitmap != null) {
                    //保存
                        saveImageToGallery(context, bitmap);
                    }
                }
            }.execute(url);
        }

    接着是url 转为bitmap的方法

     /**
         * url  到  bitmap
         * @param httpUrl
         * @return
         */
        private Bitmap decodeBitmap(String httpUrl) {
            URL url = null;
            Bitmap bm = null;
            try {
                url = new URL(httpUrl);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            try {
                InputStream in = url.openStream();
                bm = BitmapFactory.decodeStream(in);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bm;
        }

    接下来是保存bitmap到本地通知图库的方法

     /**
         * 保存图片到图库的方法
         *
         * @param context
         * @param bmp
         */
        public void saveImageToGallery(Context context, Bitmap bmp) {
            // 首先保存图片
            File appDir = new File(Environment.getExternalStorageDirectory(), "picdir");
            if (!appDir.exists()) {
                appDir.mkdir();
            }
    
            String fileName = System.currentTimeMillis() + ".jpg";
            File file = new File(appDir, fileName);
            try {
                FileOutputStream fos = new FileOutputStream(file);
                bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                fos.flush();
                fos.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 其次把文件插入到系统图库
            try {
                Toast.makeText(context, "保存图片", Toast.LENGTH_SHORT).show();
                MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null);
    
    
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 最后通知图库更新
            context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory() + "/picdir")));
    // Uri uri = Uri.fromFile(file);       //file  是你图片的路径   直接更新图片的路径更好(建议使用)
    //        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
    
            Toast.makeText(context, "图库更新成功", Toast.LENGTH_SHORT).show();
        }

    附上调用的片段吧:

    这里写图片描述

    好了,就是如此简单.注意6.0以上直接访问读写文件需要注意检查权限!!!

    展开全文
  • 但是保存以后,直接找到那个文件,打开却是没有转换的图片。 2,我们的保存文件的方法是 public static void saveFile(Context context,Bitmap bm, File file) throws IOException { BufferedOutputStream ...
  • 安卓 保存图片功能

    2019-03-15 14:10:21
    //命名一样,防止多次保存出现多个一样的图片文件 MediaStore.Images.Media.insertImage(getContentResolver(), bm, fileName, ""); //发送系统通知消息 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT...
    public void download(View v) {
        saveBitmap(convertViewToBitmap(image));
    }
    public Bitmap convertViewToBitmap(View view) {
        int w = view.getWidth();
        int h = view.getHeight();
        Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bmp);
        c.drawColor(Color.WHITE);
        /** 如果不设置canvas画布为白色,则生成透明 */
        //view.layout(0, 0, w, h);
        view.draw(c);
        return bmp;
    }
    /**
     * 保存方法
     */
    public void saveBitmap(Bitmap bm) {
        String fileName = System.currentTimeMillis() + ".jpg";//命名一样,防止多次保存出现多个一样的图片文件
        MediaStore.Images.Media.insertImage(getContentResolver(), bm, fileName, "");
        //发送系统通知消息
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//如果是4.4及以上版本
            Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            Uri contentUri = Uri.fromFile(new File("/sdcard/Pictures")); //输出目录
            mediaScanIntent.setData(contentUri);
            sendBroadcast(mediaScanIntent);
        } else {
            //<=4.4版本使用,不然高版本直接权限拒绝崩溃
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
        }
        Toast.makeText(this, "下载二维码成功!", Toast.LENGTH_SHORT).show();
    }
    
    展开全文
  • 安卓保存图片到本地

    2021-01-09 11:44:40
    private void copyFileByUri(Uri uri) { //存入PICTURES文件夹 String savePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath(); String filename = ...

    保存文件需先添加权限

        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
    6.0以上需动态申请权限

    1.根据File保存

     public static void saveFileToLocal(File imgFile) {
            //保存目录
            String dirName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
            //图片文件名
            String filename = Calendar.getInstance().getTimeInMillis() + ".jpg";
    
            File saveFile = new File(dirName, filename);
    
            FileInputStream inStream = null;
            FileOutputStream outStream = null;
            try {
                if (!saveFile.exists()) {
                    saveFile.createNewFile();
                }
    
                inStream = new FileInputStream(imgFile);
    
                outStream = new FileOutputStream(saveFile);
                FileChannel inChannel = inStream.getChannel();
                FileChannel outChannel = outStream.getChannel();
                inChannel.transferTo(0, inChannel.size(), outChannel);
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (inStream != null) {
                        inStream.close();
                    }
    
                    if (outStream != null) {
                        outStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    2.根据Bitmap保存

     public static void saveBitmapToLocal(Bitmap bitmap) {
            //保存目录
            String dirName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
            //图片文件名
            String filename = Calendar.getInstance().getTimeInMillis() + ".jpg";
    
            File saveFile = new File(dirName, filename);
    
            try {
                if (!saveFile.exists()) {
                    saveFile.createNewFile();
                }
    
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
                FileOutputStream fos = new FileOutputStream(saveFile.getPath());
                fos.write(os.toByteArray());
                fos.flush();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }

     

    3.根据图片url保存图片(结合Glide)

    (1) 转File保存

     public static void saveImgurlByFile(Context context, String url) {
            Glide
                    .with(context)
                    .downloadOnly()
                    .load(url)
                    .into(new CustomTarget<File>() {
                        @Override
                        public void onResourceReady(@NonNull File resource, @Nullable Transition<? super File> transition) {
                            //根据File保存
                            saveFileToLocal(resource);
                        }
    
                        @Override
                        public void onLoadCleared(@Nullable Drawable placeholder) {
    
                        }
                    });
        }

    (2) 转Bitmap保存

        public static void saveImgurlByBitmap(Context context, String url) {
            Glide
                    .with(context)
                    .asBitmap()
                    .load(url)
                    .into(new CustomTarget<Bitmap>() {
                        @Override
                        public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                            //根据bitmap保存
                            saveBitmapToLocal(resource);
                        }
    
                        @Override
                        public void onLoadCleared(@Nullable Drawable placeholder) {
    
                        }
                    });
        }

     

    4.根据图片Uri保存图片

      public static void saveImgByUri(Uri uri) {
            saveImgToLocal(new File(uri.getPath()));
        }

     

     

    展开全文
  • 安卓保存bitmap到本地

    千次阅读 2018-01-26 12:16:03
    在用picasso的时候,想把获取的的bitmap保存到本地: Picasso.with(getActivity()).load(imgUrls.get(position)).into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.Loa...
  • 安卓 保存图片到sd卡

    2019-10-09 20:25:23
    SimpleDateFormat ft = new SimpleDateFormat("yyyyMMddHHmmss"); String theTime = ft.format(new Date()); savaBitmap("手机截图"+theTime+".png", ...// 保存图片到手机指定目录 public void savaBitmap...
  • 下面我将讲一下初学者应该掌握的安卓保存数据的三种方式 要求:做一个登录的界面,用户可以输入账号和密码,有确定的按钮,有一个记住密码的勾选框,若用户在选择记住密码后,下次登录时账号密码仍然存在,不需要...
  • 我们把内容保存的内置存储里面。(直接封装成一个类) /** * @author 小游 */ public class FileUtil { /** * 读取文件 * @param context 当前上下文 * @param mFileName 文件名字 * @return */ p.
  • 安卓手机扩展名为.unknown,保存失灵 解决办法: filePath: wx.env.USER_DATA_PATH + ‘/’ + fileName + ‘.png’, 查看是否授权然后在执行保存方法 savePoster: function () { let that = this wx....
  • 项目中遇到个情况,在电视主板上开发应用时需要调试信息,但是adb和串口的使用均受到限制,无法捕获调试信息,想到使用IO流的方式将log信息保存到本地,特定条件下可复制到U盘中 首先是定义保存log信息的文件名和保存...
  • 我们在开发过程中,经常遇到这样的需求,就是从网络获取URL,展示到imageview,并需要长按保存。 具体操作: 第一步,从网络获取图片,并且展示到imageview 。这个不需要赘述,glide 直接设置就可以,当前也可以...
  • 主要代码如下,老是提示路径 not a directory private static final String SDCARD_CACHE_IMG_PATH = Constants.SD_PATH + "/Children/ImagesStore/"; public static boolean saveImage(Bitmap ...
  • 最近爸爸需要我将联系人全部用纸写下来,老人家怕手机容易出问题,他的联系人就没了,保存在纸上最安全,怎么可能,要我写字是不可能的(滑稽脸),想了一下当然是搞个安卓软件保存一下,保存txt再打印,快速还不...
  • 接上文,还有一个工具类,把代码也贴出来,大家可以参考一下。根据自己的需要灵活的改动 ... import android.app.Activity; import android.content.Context;...import android.graphics.Rect;...import android.util...
  • 接上文,此文将放出上文中使用的几个工具类。 ... import android.app.Dialog; import android.content.Context;...import android.support.annotation.ColorRes;...import android.view.LayoutInf...
  • 在公司最近做的项目中,需要用户在小程序里保存签名为jpg格式图片并打印签名,但是,我用canvas绘制签名后,ios保存图片背景是白色,安卓则是黑色; 这是因为ios会将jpg格式图片的透明背景填充成白色,安卓则是填充...
  • 安卓保存数据到SD卡

    2014-09-10 15:17:20
    使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在...
  • 最近在研究怎么将安卓应用中的图片保存到手机相册。 并且解决有一些手机保存图片到相册会出现发黄的问题。 如果要保存图片先在manifest中开启读写权限。   &lt;!-- 在SDCard中创建与删除文件权限 --&...
  • 最近在做项目中遇到保存照片和视频,本地已经保存而在相册和项目中不能找到,这里做一个简单的总结 在本地保存之后需要吧文件发送到本地或者广播的方式刷新相册 1.照片发送到相册 //把文件插入到系统图库 /** ...
  • 安卓保存图片到SD卡,使用byte流

    千次阅读 2015-02-05 15:43:21
    头几天遇到一个问题:在安卓开发应用中保存图片到SD卡,并且 用户在图库中搜到,类似于缓存的那种形式。最开始的第一想法是改一下后缀名,例如把一个图片保存为image1.txt,这样保存当然没问题,但在应用中读取中就...
  • /** * @param context * @param targetFile 要保存的照片文件 * @param path 要保存的照片的路径地址 */ public static void addMediaStore(Context context, File targetFile, String path) { Content
  • 安卓设备配置【一系列特征的组合:屏幕方向,屏幕像素密度,屏幕尺寸,键盘类型,底座模式,以及语言等】发生改变时,可能会有更合适的资源来匹配新的设备环境。 于是,Android会销毁当前activity,为新配置寻找...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,185
精华内容 1,274
关键字:

安卓保存