Android保存图片到图库,扫描文件到媒体库,保存图片到SD卡,可用于下载图片

下载图片,方便用于查找


/** 
 * 保存图片到SD卡 
 * @author kl
 * @param isInsertGallery 是否保存到图库 
 * @return 
 */  
private String saveImg(Bitmap bitmap, boolean isInsertGallery){  
    File myappDir = new File(Environment.getExternalStorageDirectory(), "myapp");  
    if(myappDir.exists() && myappDir.isFile()) {  
        myappDir.delete();  
    }  
    if (!myappDir.exists()) {  
        myappDir.mkdir();  
    }  
    String fileName = System.currentTimeMillis() + ".png";  
    File file = new File(myappDir, fileName);  
    if(file.exists()) {  
        file.delete();  
    }  
    try {  
        FileOutputStream fos = new FileOutputStream(file);  
        bitmap.compress(CompressFormat.PNG, 100, fos);  
        fos.flush();  
        fos.close();  
    } catch (FileNotFoundException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
    if(isInsertGallery) {  
        try {  
            MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), fileName, null);  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }  
    }  
    return file.getAbsolutePath();  
} 




更新相册

 /** 
     * 保存后用广播扫描,Android4.4以下使用这个方法 
     * @author kl
     */  
    private void saveBroadcast(){  
        String filePath = saveImg(true);  
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + filePath)));  
        Toast.makeText(this, "保存成功:" + filePath, Toast.LENGTH_LONG).show();  
    }  
  
    /** 
     * 保存后用MediaScanner扫描,通用的方法 
     * @author kl
     */  
    private void saveScan(){  
        String filePath = saveImg(false);  
        MediaScanner mediaScanner = new MediaScanner(this);  
        String[] filePaths = new String[]{filePath};  
        String[] mimeTypes = new String[]{MimeTypeMap.getSingleton().getMimeTypeFromExtension("png")};  
        mediaScanner.scanFiles(filePaths, mimeTypes);  
        Toast.makeText(this, "保存成功:" + filePath, Toast.LENGTH_LONG).show();  
    }  
  
  

为什么说是Android4.4之前呢?因为Android4.4开始,Android把系统广播的权限回收了,只有系统应用才可以发送系统广播,那么这还怎么活啊???不要着急,车道山前必有路,还有一个MediaScannerConnection,这个玩意儿可强大了,不仅仅可以搞定图片,只要是媒体文件都可以用他来扫描,不过要知道文件的MimeType,不知道怎么获取文件MimeType的看这里: http://blog.csdn.net/yanzhenjie1003/article/details/44936643


在Android4.4和之后用MediaScannerConnection来扫描。

这里讲解一下怎么用MediaScannerConnection来扫描文件,我封装好了一个类出来:

/** 
 * 实现MediaScannerConnection.MediaScannerConnectionClient 
 * @author kl
 * @Time 2017年1月8日 
 */  
public class MediaScanner implements MediaScannerConnection.MediaScannerConnectionClient {  
  
    /** 
     * 扫描对象 
     */  
    private MediaScannerConnection mediaScanConn = null;  
  
    public MediaScanner(Context context) {  
        //实例化  
        mediaScanConn = new MediaScannerConnection(context, this);  
    }  
  
    /**文件路径集合**/  
    private String[] filePaths;  
    /**文件MimeType集合**/  
    private String[] mimeTypes;  
  
    /** 
     * 扫描文件 
     * @author kl
     * @param filepaths 
     * @param mimeTypes 
     */  
    public void scanFiles(String[] filePaths, String[] mimeTypes) {  
        this.filePaths = filePaths;  
        this.mimeTypes = mimeTypes;  
        mediaScanConn.connect();//连接扫描服务  
    }  
  
    /** 
     * @author kl
     */  
    @Override  
    public void onMediaScannerConnected() {  
        for (int i = 0; i < filePaths.length; i++) {  
            mediaScanConn.scanFile(filePaths[i], mimeTypes[i]);//服务回调执行扫描  
        }  
        filePaths = null;  
        mimeTypes = null;  
    }  
  
    private int scanTimes = 0;  
  
    /** 
     * 扫描一个文件完成 
     * @author kl
     * @param path 
     * @param uri 
     */  
    @Override  
    public void onScanCompleted(String path, Uri uri) {  
        scanTimes ++;  
        if(scanTimes == filePaths.length) {//如果扫描完了全部文件  
            mediaScanConn.disconnect();//断开扫描服务  
            scanTimes = 0;//复位计数  
        }  
    }  
}  



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值