经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android--解决图片保存到相册显示1970年1月1日 8:00的问题
来源:cnblogs  作者:灬布衣丶公爵丨  时间:2018/11/8 9:43:53  对本文有异议
  1. import android.content.Context;
  2. import android.content.Intent;
  3. import android.database.Cursor;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.Canvas;
  7. import android.graphics.Matrix;
  8. import android.graphics.Paint;
  9. import android.graphics.Rect;
  10. import android.media.MediaScannerConnection;
  11. import android.net.Uri;
  12. import android.os.Environment;
  13. import android.provider.MediaStore;
  14. import android.view.View;
  15. public class PictureUtils {
  16. private static String TAG = PictureUtils.class.getSimpleName();
  17. private static int CODE_WIDTH = 60;
  18. private static int CODE_HEIGHT = 60;
  19. private PictureUtils() {
  20. }
  21. /**
  22. * 保存一张或者多张图片到图库
  23. */
  24. public static void saveImageListToGallery(final BaseActivity context,
  25. final List<String> imgList, final OnSaveImgCallBack callBack) {
  26. if (context == null) {
  27. LogUtils.dTag(TAG, "context 不能为null");
  28. return;
  29. }
  30. RxPermissionsUtils.getInstance()
  31. .requestPermission(context, RxPermissionsUtils.READ_AND_WRITE_PERMISSION,
  32. new RxPermissionsUtils.OnPermissionRequestCallBack() {
  33. @Override
  34. public void onSuccess() {
  35. if (imgList == null) {
  36. LogUtils.dTag(TAG, "图片数组为 null");
  37. return;
  38. }
  39. // 保存图片到图库
  40. saveImageListToGalleryPrivate(context, imgList, callBack);
  41. }
  42. @Override
  43. public void onFail() {
  44. ToastUtils.showShort("请在设置授予应用存储权限^_^");
  45. PermissionUtils.launchAppDetailsSettings();
  46. }
  47. });
  48. }
  49. /**
  50. * 保存多张图片
  51. */
  52. private static void saveImageListToGalleryPrivate(BaseActivity context, List<String> imgList,
  53. final OnSaveImgCallBack callBack) {
  54. Observable.just(imgList)
  55. .observeOn(Schedulers.io())
  56. .flatMap(new Function<List<String>, ObservableSource<Boolean>>() {
  57. @Override
  58. public ObservableSource<Boolean> apply(List<String> strings) throws Exception {
  59. for (String filePath : strings) {
  60. if (filePath.startsWith("http://") || filePath.startsWith("https://")) {
  61. Bitmap bmp = Glide.with(BaseApplication.getInstance())
  62. .asBitmap()
  63. .load(filePath)
  64. .submit()
  65. .get();
  66. saveImageToGallery(BaseApplication.getInstance(), bmp, filePath);
  67. } else {
  68. Bitmap bmp = BitmapFactory.decodeFile(filePath);
  69. saveImageToGallery(BaseApplication.getInstance(), bmp, filePath);
  70. }
  71. }
  72. return Observable.just(true);
  73. }
  74. })
  75. .observeOn(AndroidSchedulers.mainThread())
  76. .subscribe(new Observer<Boolean>() {
  77. Disposable mD;
  78. @Override
  79. public void onSubscribe(Disposable d) {
  80. mD = d;
  81. if (callBack != null) {
  82. callBack.onSaveStart();
  83. }
  84. }
  85. @Override
  86. public void onNext(Boolean aBoolean) {
  87. ToastUtils.showShort("图片已成功保存到系统相册^_^");
  88. if (callBack != null) {
  89. callBack.onSaveSuccess();
  90. }
  91. }
  92. @Override
  93. public void onError(Throwable e) {
  94. if (mD != null) {
  95. mD.dispose();
  96. }
  97. if (callBack != null) {
  98. callBack.onSaveFail();
  99. }
  100. }
  101. @Override
  102. public void onComplete() {
  103. if (mD != null) {
  104. mD.dispose();
  105. }
  106. }
  107. });
  108. }
  109. /**
  110. * 保存 Bitmap 到相册 获得路径
  111. */
  112. public static String saveImageToGallery(Context context, Bitmap bmp, String imageUrl) {
  113. if (!SDCardUtils.isSDCardEnableByEnvironment()) {
  114. LogUtils.dTag(TAG, "内存卡不可用");
  115. return null;
  116. }
  117. // 首先保存图片
  118. File appDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),
  119. NetWorkConstants.FileKey.COMMONLIB_SHARE_CODE_DIR_NAME);// 获取文件存储路径
  120.  
  121. if (!appDir.exists()) {
  122. boolean isCreate = appDir.mkdir();
  123. if (!isCreate) {
  124. return null;
  125. }
  126. }
  127. // 创建文件 截取,取出名字
  128. String url_truncated = String.valueOf(System.currentTimeMillis());
  129. String fileName = "mryt_share_code" + "_" + url_truncated;
  130. File file = new File(appDir, fileName);
  131. FileUtils.deleteFile(file);
  132. if (FileUtils.isFileExists(file)) {
  133. LogUtils.dTag(TAG, file.getAbsolutePath());
  134. return file.getAbsolutePath();
  135. }
  136. try {
  137. FileOutputStream fos = new FileOutputStream(file);
  138. bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
  139. fos.flush();
  140. fos.close();
  141. // 插入图库
  142. /**MediaStore.Images.Media
  143. .insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName,
  144. String.valueOf(System.currentTimeMillis()));*/
  145. } catch (FileNotFoundException e) {
  146. e.printStackTrace();
  147. } catch (IOException e) {
  148. e.printStackTrace();
  149. }
  150. // 最后通知图库更新
  151.  
  152. /**MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null,
  153. new MediaScannerConnection.OnScanCompletedListener() {
  154. @Override
  155. public void onScanCompleted(String path, Uri uri) {
  156. }
  157. });*/
  158. try {
  159. savePhotoToMedia(context, file, fileName);
  160. } catch (FileNotFoundException e) {
  161. e.printStackTrace();
  162. }
  163. return file.getAbsolutePath();
  164. }
  165. /**
  166. * 保存 Bitmap 到相册 获得路径 不传递文件名称 用时间后缀
  167. */
  168. public static String saveImageToGallery(Context context, Bitmap bmp) {
  169. // 首先保存图片
  170. File appDir = context.getExternalFilesDir(
  171. NetWorkConstants.FileKey.COMMONLIB_SHARE_CODE_DIR_NAME);// 获取文件存储路径
  172. if (appDir != null && !appDir.exists()) {
  173. boolean isCreate = appDir.mkdir();
  174. if (!isCreate) {
  175. return null;
  176. }
  177. }
  178. if (!SDCardUtils.isSDCardEnableByEnvironment()) {
  179. LogUtils.dTag(TAG, "内存卡不可用");
  180. return null;
  181. }
  182. // 创建文件 截取,取出名字
  183. String url_truncated = String.valueOf(System.currentTimeMillis());
  184. String fileName = "mryt_share_code" + "_" + url_truncated;
  185. File file = new File(appDir, fileName);
  186. if (FileUtils.isFileExists(file)) {
  187. LogUtils.dTag(TAG, file.getAbsolutePath());
  188. return file.getAbsolutePath();
  189. }
  190. try {
  191. FileOutputStream fos = new FileOutputStream(file);
  192. bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
  193. fos.flush();
  194. fos.close();
  195. // 插入图库
  196. /**MediaStore.Images.Media
  197. .insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName,
  198. String.valueOf(System.currentTimeMillis()));*/
  199. } catch (FileNotFoundException e) {
  200. e.printStackTrace();
  201. } catch (IOException e) {
  202. e.printStackTrace();
  203. }
  204. // 最后通知图库更新
  205. // context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
  206. /**MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null,
  207. new MediaScannerConnection.OnScanCompletedListener() {
  208. @Override public void onScanCompleted(String path, Uri uri) {
  209. }
  210. });*/
  211.  
  212. try {
  213. savePhotoToMedia(context, file, fileName);
  214. ToastUtils.showShort("图片已成功保存到相册");
  215. } catch (FileNotFoundException e) {
  216. e.printStackTrace();
  217. ToastUtils.showShort("图片保存失败");
  218. }
  219. return file.getAbsolutePath();
  220. }
  221. public static Bitmap getBitmapFromView(Context context, View view) {
  222. view.setDrawingCacheEnabled(true);
  223. //启用DrawingCache并创建位图
  224. view.buildDrawingCache();
  225. //创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收
  226. Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
  227. //禁用DrawingCahce否则会影响性能
  228. view.setDrawingCacheEnabled(false);
  229. return bitmap;
  230. }
  231. //图片上绘制文字
  232. public static Bitmap drawTextToBitmap(Bitmap bitmap, String text,
  233. Paint paint, Rect bounds, int paddingLeft, int paddingTop) {
  234. android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
  235. paint.setDither(true); // 获取跟清晰的图像采样
  236. paint.setFilterBitmap(true);// 过滤一些
  237. if (bitmapConfig == null) {
  238. bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
  239. }
  240. bitmap = bitmap.copy(bitmapConfig, true);
  241. Canvas canvas = new Canvas(bitmap);
  242. canvas.drawText(text, paddingLeft, paddingTop, paint);
  243. return bitmap;
  244. }
  245. public static Bitmap setImgSize(Bitmap bm, int newWidth, int newHeight) {
  246. // 获得图片的宽高.
  247. int width = bm.getWidth();
  248. int height = bm.getHeight();
  249. // 计算缩放比例.
  250. float scaleWidth = ((float) newWidth) / width;
  251. float scaleHeight = ((float) newHeight) / height;
  252. // 取得想要缩放的matrix参数.
  253. Matrix matrix = new Matrix();
  254. matrix.postScale(scaleWidth, scaleHeight);
  255. // 得到新的图片.
  256. return Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
  257. }
  258. // 保存图片的回调
  259. public interface OnSaveImgCallBack {
  260. void onSaveStart();
  261. void onSaveSuccess();
  262. void onSaveFail();
  263. }
  264. public static void savePhotoToMedia(Context context, File file, String fileName)
  265. throws FileNotFoundException {
  266. String uriString = MediaStore.Images.Media
  267. .insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null);
  268. // String uriString = MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, null, null);
  269. File file1 = new File(getRealPathFromURI(Uri.parse(uriString), context));
  270. updatePhotoMedia(file1, context);
  271. }
  272. //更新图库
  273. private static void updatePhotoMedia(File file, Context context) {
  274. Intent intent = new Intent();
  275. intent.setAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
  276. intent.setData(Uri.fromFile(file));
  277. context.sendBroadcast(intent);
  278. }
  279. //得到绝对地址
  280. private static String getRealPathFromURI(Uri contentUri, Context context) {
  281. String[] proj = {MediaStore.Images.Media.DATA};
  282. Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
  283. if (cursor == null) {
  284. return "";
  285. }
  286. int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  287. cursor.moveToFirst();
  288. String fileStr = cursor.getString(column_index);
  289. cursor.close();
  290. return fileStr;
  291. }
  292. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号