現在項目中基本都有這樣的需求,把圖片保存到本地相冊
這是一個工具類代碼如下:
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;
}
}
Android 6.0的手機需要先申請權限,拿到權限後再保存,否則會失敗
添加依賴
compile ‘pub.devrel:easypermissions:0.3.0’
實現EasyPermissions.PermissionCallbacks,重寫獲取權限的方法
@OnClick(R.id.save)
public void save() {
requestPermission();
}
/**
* 請求讀取sd卡的權限
*/
private void requestPermission() {
if (Build.VERSION.SDK_INT >= 23) {
//讀取sd卡的權限
String[] mPermissionList = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (EasyPermissions.hasPermissions(getApplicationContext(), mPermissionList)) {
//已經同意過
saveImage();
} else {
//未同意過,或者說是拒絕了,再次申請權限
EasyPermissions.requestPermissions(
this, //上下文
"保存圖片需要讀取sd卡的權限", //提示文言
REQUEST_CODE_SAVE_IMG, //請求碼
mPermissionList //權限列表
);
}
} else {
saveImage();
}
}
/**
* 保存圖片
*/
private void saveImage() {
System.out.println(" 6666 ");
System.out.println(current + " current ");
final String urls = imagesUrl.get(current);
System.out.println(urls + " url ");
System.out.println(" 8888 ");
// Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.fj);
new Thread(new Runnable() {
Bitmap bitmap = null;
@Override
public void run() {
URL url = null;
try {
url = new URL("http://test.zuihou99.com" + urls);
InputStream is = null;
BufferedInputStream bis = null;
try {
is = url.openConnection().getInputStream();
bis = new BufferedInputStream(is);
bitmap = BitmapFactory.decodeStream(bis);
boolean isSaveSuccess = ImgUtils.saveImageToGallery(getApplicationContext(), bitmap);
if (isSaveSuccess) {
Looper.prepare();
Toast.makeText(getApplicationContext(), "保存圖片成功", Toast.LENGTH_SHORT).show();
Looper.loop();
} else {
Looper.prepare();
Toast.makeText(getApplicationContext(), "保存圖片失敗,請稍後重試", Toast.LENGTH_SHORT).show();
Looper.loop();
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 根據圖片的url路徑獲得Bitmap對象
*
* @param url
* @return
*/
private Bitmap decodeUriAsBitmapFromNet(String url) {
URL fileUrl = null;
Bitmap bitmap = null;
try {
fileUrl = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection) fileUrl
.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
//授權結果,分發下去
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Forward results to EasyPermissions
//跳轉到onPermissionsGranted或者onPermissionsDenied去回調授權結果
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
//同意授權
@Override
public void onPermissionsGranted(int requestCode, List<String> list) {
saveImage();
}
//拒絕授權
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
//打開系統設置,手動授權
new AppSettingsDialog.Builder(this).build().show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
//拒絕授權後,從系統設置了授權後,返回APP進行相應的操作
saveImage();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO: add setContentView(...) invocation
ButterKnife.bind(this);
}
這樣就可以了,有不對的歡迎指出
這裏附上源碼http://download.csdn.net/download/qq_23668969/10042303