Android下载图片到相册

2018-12-11 10:20:40

原理 一     整体代码再后面

github地址:(完整demo,欢迎下载)
https://github.com/zhouxu88/SaveImgToGallery/tree/master

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

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

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

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

或者

MediaStore.Images.Media.insertImage(getContentResolver(), "image path", "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("your path"))););

完整代码

  • 1、保存Bitmap到本地指定路径下

  • 2、通过广播,通知系统相册图库刷新数据

public class ImgUtils {    //保存文件到指定路径
    public static boolean saveImageToGallery(Context context, Bitmap bmp) {        // 首先保存图片
        String storePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dearxy";
        File appDir = new File(storePath);        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = System.currentTimeMillis() + ".jpg";
        File file = new File(appDir, fileName);        try {
            FileOutputStream fos = new FileOutputStream(file);            //通过io流的方式来压缩保存图片
            boolean isSuccess = bmp.compress(Bitmap.CompressFormat.JPEG, 60, fos);
            fos.flush();
            fos.close();            //把文件插入到系统图库
            //MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null);

            //保存图片后发送广播通知更新数据库
            Uri uri = Uri.fromFile(file);
            context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));            if (isSuccess) {                return true;
            } else {                return false;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }        return false;
    }
}

注意:
1、别忘了权限

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

2、如果是6.0手机,记得先申请权限,拿到权限后,再保存,不然会失败,我就是在这里被坑了



作者:唠嗑008
链接:https://www.jianshu.com/p/8cede074ba5b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


整体代码



下载类,可以url下载,也可以本地的drawable下载到相册,记得在清单加权限,6.0代码动态加权限判断,下载图片要在子线程中下载,下载完后广播更新相册


代码下载地址:链接:https://pan.baidu.com/s/1dsjx2QCSw2SxRcUW0Z3Xqg 

                        提取码:i8j2


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

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

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

package com.example.administrator.myimageload;

 

/**

 * Created by Administrator on 2018/9/17.

 */

 

import android.app.ProgressDialog;

import android.content.Context;

import android.content.Intent;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.net.Uri;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.provider.MediaStore;

import android.text.TextUtils;

import android.util.Log;

import android.widget.Toast;

 

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.UUID;

 

/**

 * Created by vimi8 on 2017/6/9.

 */

 

public class ImgDonwloads {

 

    private static String filePath;

    private static Bitmap mBitmap;

    private static String mFileName="sshs";

    private static String mSaveMessage;

    private final static String TAG = "ImageActivity";

    private static Context context;

 

    private static ProgressDialog mSaveDialog = null;

 

    public static void donwloadImg(Context contexts,String filePaths){

        context = contexts;

        filePath = filePaths;

        mSaveDialog = ProgressDialog.show(context, "保存二维码", "二维码图片正在保存中,请稍等...", true);

 

        new Thread(saveFileRunnable).start();

    }

 

    private static Runnable saveFileRunnable = new Runnable(){

        @Override

        public void run() {

            try {

//                mBitmap = BitmapFactory.decodeStream(getImageStream(filePath));

 

                if (!TextUtils.isEmpty(filePath)) {                 //网络图片

                    //对资源链接

                    URL url=new URL(filePath);

                    //打开输入流

                    InputStream inputStream=url.openStream();

                    //对网上资源进行下载转换位图图片

                    mBitmap= BitmapFactory.decodeStream(inputStream);

                    inputStream.close();

                }

 

                Bitmap    bmp = BitmapFactory.decodeResource(context.getResources(),R.drawable.bg_guid_1 );   //本地的图片,根据自己情况

//                saveFile(mBitmap, mFileName);

                saveFile(bmp);

                mSaveMessage = "图片保存成功!";

            } catch (IOException e) {

                mSaveMessage = "图片保存失败!";

                e.printStackTrace();

            } catch (Exception e) {

                e.printStackTrace();

            }

            messageHandler.sendMessage(messageHandler.obtainMessage());

        }

    };

    private static Handler messageHandler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            mSaveDialog.dismiss();

            Log.d(TAG, mSaveMessage);

            Toast.makeText(context, mSaveMessage, Toast.LENGTH_SHORT).show();

        }

    };

 

 

    /**

     * Get image from newwork

     * @param path The path of image

     * @return InputStream

     * @throws Exception

     */

    public static InputStream getImageStream(String path) throws Exception{

        URL url = new URL(path);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setConnectTimeout(5 * 1000);

        conn.setRequestMethod("GET");

        if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){

            return conn.getInputStream();

        }

        return null;

    }

    /**

     * 保存文件

     * @param bm

     * @param fileName

     * @throws IOException

     */

    public static void saveFile(Bitmap bm, String fileName) throws IOException {

        File dirFile = new File(Environment.getExternalStorageDirectory().getPath());

        if(!dirFile.exists()){

            dirFile.mkdir();

        }

        fileName = UUID.randomUUID().toString()+".jpg";

        File myCaptureFile = new File(Environment.getExternalStorageDirectory().getPath() +"/DCIM/Camera/"+ fileName);

        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));

        bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);

        bos.flush();

        bos.close();

 

        //把图片保存后声明这个广播事件通知系统相册有新图片到来

        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

        Uri uri = Uri.fromFile(myCaptureFile);

        intent.setData(uri);

        context.sendBroadcast(intent);

    }

    /**

     * 保存图片到图库

     * @param bmp

     */

    public static void saveFile( Bitmap bmp) {

        // 首先保存图片

        File appDir = new File(Environment.getExternalStorageDirectory(),

                "sshs");

        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, 80, 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()))));

    }

}

MainActivity类


 

public class MainActivity extends AppCompatActivity {

    private Bitmap bitmap;

    private TextView tv ;

    String iPath = "http://i.imgur.com/DvpvklR.png";

  

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        

        tv = (TextView) findViewById(R.id.tv);

//        download() ;

        tv.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                List<String> permissionList = new ArrayList<>();

                if (ContextCompat.checkSelfPermission(MainActivity.this,

                        Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

                    permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);

                }

                if (!permissionList.isEmpty()) {

                    String[] permissions = permissionList.toArray(new String[permissionList.size()]);

                    ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);

                } else {

                    ImgDonwloads.donwloadImg(MainActivity.this,"");//iPath

                }

 

 

            }

        });

 

    }

    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {

            case 1:

                if (grantResults.length > 0) {

                    for (int result : grantResults) {

                        if (result != PackageManager.PERMISSION_GRANTED) {

                            Toast.makeText(this, "拒绝了权限", Toast.LENGTH_SHORT).show();

//                            finish();

                            return;

                        }

                    }

                    ImgDonwloads.donwloadImg(MainActivity.this,"");

                } else {

                    Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();

//                    finish();

                }

                break;

            default:

        }

    }

   

 

    

}

--------------------- 

作者:code_dream_wq 

来源:CSDN 

原文:https://blog.csdn.net/code_dream_wq/article/details/82771800 

版权声明:本文为博主原创文章,转载请附上博文链接!

  • 2020-11-17 10:05:53

    mongoDB 修改密码

    mongodb的用户信息是存放在system.users表中的,修改密码不能直接更新表数据,这样的话,存到表里的密码是明文的,这就不对了。

  • 2020-11-17 10:13:16

    Vue.observable()进行状态管理

    随着组件的细化,就会遇到多组件状态共享的情况, Vuex当然可以解决这类问题,不过就像 Vuex官方文档所说的,如果应用不够大,为避免代码繁琐冗余,最好不要使用它,今天我们介绍的是 vue.js 2.6 新增加的 Observable API ,通过使用这个 api 我们可以应对一些简单的跨组件数据状态共享的情况。

  • 2020-11-17 10:17:18

    MongoDB日志文件查看

    默认情况下,MongoDB在此路径/var/log/mongodb/mongodb.log创建日志文件,如果找不到该日志文件,请检查MongoDB配置文件。

  • 2020-11-17 11:57:16

    app抓包无数据

    我们经常在wifi设置中 设置代理到我们的pc http代理软件上,多数情况下,此时我们开启的app流量都可以在代理软件上看到,比如charles , fiddler等等。 但是细心的人会发现 某些大厂的app 某些请求 在这些 http代理软件上就是抓不到, 给人的感觉就是 流量没从代理软件走一样。

  • 2020-11-17 11:57:55

    app抓不到包,解决很简单

    1.手机安装virtualXpost 并激活xpost 框架,如有问题自行百度。 2.安装justTrustMe,然后再virtualXpost中添加此模块 3.安装手机抓包神器packet capture 4.在virtualXpost中运行app,并打开packet capture抓包就行

  • 2020-11-17 16:50:16

    JS常见加密混淆方式

    目录 前端js常见混淆加密保护方式 eval方法等字符串参数 emscripten WebAssembly js混淆实现 JSFuck AAEncode JJEncode 代码压缩 变量名混淆 字符串混淆 自我保护,比如卡死浏览器 控制流平坦化 僵尸代码注入 对象键名替换 禁用控制台输出 调试保护,比如无限Debug,定时Debug 域名锁定