功能:选择相册或者拍照图片保存到本地,下次打开程序直接显示,图片可裁剪。
一。新建布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".activity.MainActivity"><ImageView
        android:id="@+id/img"android:layout_width="100dp"android:layout_height="100dp"android:layout_gravity="center_horizontal"android:src="@mipmap/ic_launcher" /><Button
        android:id="@+id/btn1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="@dimen/height_30px"android:text="选取图片" /><Button
        android:id="@+id/btn2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="手机拍照" /></LinearLayout>

二:Activity中展示
onCreate中显示本地图片

 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.btn1);btn2 = (Button) findViewById(R.id.btn2);img = (ImageView) findViewById(R.id.img);btn.setOnClickListener(this);btn2.setOnClickListener(this);//读取保存的位图(图片)Bitmap bitmap1 = readImg();if (bitmap1 != null) {img.setImageBitmap(bitmap1);} else {return;}}

读取路径下图片
Constant.SDPATH路径为下面路径
public static final String SDPATH = Environment.getExternalStorageDirectory() + “/northAmerica/”

//读取位图(图片)private Bitmap readImg() {File mfile = new File(Constant.SDPATH + "/abc" + ".JPEG");Bitmap bm = null;if (mfile.exists()) {        //若该文件存在bm = BitmapFactory.decodeFile(Constant.SDPATH + "/abc" + ".JPEG");}return bm;}

打开相册与拍照方法

@Overridepublic void onClick(View v) {Intent intent;switch (v.getId()) {case R.id.btn1://打开手机的图库;if (Build.VERSION.SDK_INT >= 23) {int checkPermission =    ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE);if (checkPermission != PackageManager.PERMISSION_GRANTED) {(new AlertDialog.Builder(MainActivity.this)).setMessage("您需要在设置里打开存储空间权限。").setPositiveButton("确认", new android.content.DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 100);}}).setNegativeButton("取消", (android.content.DialogInterface.OnClickListener) null).create().show();return;}}intent = new Intent();intent.setType("image/*");intent.setAction(Intent.ACTION_GET_CONTENT);startActivityForResult(intent, 0x1);break;case R.id.btn2:if (Build.VERSION.SDK_INT >= 23) {int checkPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE);if (checkPermission != PackageManager.PERMISSION_GRANTED) {(new AlertDialog.Builder(MainActivity.this)).setMessage("您需要在设置里打开存储空间权限。").setPositiveButton("确认", new android.content.DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 100);}}).setNegativeButton("取消", (android.content.DialogInterface.OnClickListener) null).create().show();return;}}intent = new Intent();//MediaStore.ACTION_IMAGE_CAPTURE  调用系统的照相机intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent, 0x3);break;}}

在onActivityResult方法接收

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == 0x1) {if (data != null) {Uri uri = data.getData();  //裁剪图片getImg(uri);} else {return;}}if (requestCode == 0x2) {if (data != null) {Bundle bundle = data.getExtras();//得到图片Bitmap bitmap = bundle.getParcelable("data");
//                //保存到图片到本地FileUtils.saveBitmap(bitmap, "abc");//设置图片img.setImageBitmap(bitmap);} else {return;}}if (requestCode == 0x3) {if (data != null) {Bundle bundle = data.getExtras();Bitmap bitmap = bundle.getParcelable("data");FileUtils.saveBitmap(bitmap, "abc");img.setImageBitmap(bitmap);} else {return;}}}

调用裁剪图片

 private void getImg(Uri uri) {try {InputStream inputStream = getContentResolver().openInputStream(uri);//从输入流中解码位图// Bitmap bitmap = BitmapFactory.decodeStream(inputStream);//保存位图// img.setImageBitmap(bitmap);cutImg(uri);//关闭流inputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//裁剪图片private void cutImg(Uri uri) {if (uri != null) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");//true:出现裁剪的框intent.putExtra("crop", "true");//裁剪宽高时的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);//裁剪后的图片的大小intent.putExtra("outputX", 300);intent.putExtra("outputY", 300);intent.putExtra("return-data", true);  // 返回数据intent.putExtra("output", uri);intent.putExtra("scale", true);startActivityForResult(intent, 0x2);} else {return;}}

保存图片到本地方法

public static void saveBitmap(Bitmap bm, String picName) {Log.e("", "保存图片");try {if (!isFileExist("")) {File tempf = createSDDir("");}File f = new File(Constant.SDPATH, picName + ".JPEG");if (f.exists()) {f.delete();}FileOutputStream out = new FileOutputStream(f);bm.compress(Bitmap.CompressFormat.JPEG, 90, out);out.flush();out.close();Log.e("", "已经保存");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

OK 搞定了。
下面展示下部裁剪图片(相册)
通过uri转换成字符串然后转换成bitmap进行展示

if (requestCode == 0x1) {if (data != null) {Uri uri = data.getData();//+++   不裁剪String path = null;try {path = getFilePathWithUri(data.getData(), MainActivity.this);} catch (Exception e) {e.printStackTrace();}if (!TextUtils.isEmpty(path)) {showImg(path);} else {showToast("获取图片路径失败");}//++//裁剪图片
//                getImg(uri);} else {return;}
 /*** 通过URI获取文件的路径* @param uri* @param activity*/public static String getFilePathWithUri(Uri uri, Activity activity) throws Exception {if (uri == null) {return "";}String picturePath = null;String scheme = uri.getScheme();if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {String[] filePathColumn = {MediaStore.Images.Media.DATA};Cursor cursor = activity.getContentResolver().query(uri,filePathColumn, null, null, null);//从系统表中查询指定Uri对应的照片cursor.moveToFirst();int columnIndex = cursor.getColumnIndex(filePathColumn[0]);picturePath = cursor.getString(columnIndex);  //获取照片路径cursor.close();} else if (ContentResolver.SCHEME_FILE.equals(scheme)) {picturePath = uri.getPath();}return picturePath;}/*** 显示图片(相册方式)* @param imagePath*/private void showImg(String imagePath) {BitmapFactory.Options option = new BitmapFactory.Options();option.inSampleSize = 2;Bitmap bitmap = BitmapFactory.decodeFile(imagePath, option);img.setImageBitmap(bitmap);}

完成。

android相册拍照保存图片到本地相关推荐

  1. Android手机拍照或从本地相册选取图片设置头像。适配小米、华为、7.0

    https://www.jianshu.com/p/9404515fde30 传送门 https://github.com/jiaweizeng/BalaPortrait 设置头像通常有两种方式: 1 ...

  2. android 小米加载大图,Android手机拍照或从本地相册选取图片设置头像。适配小米、华为、7.0...

    1,让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像. 2,让用户启动手机的相机拍照,拍完照片后裁剪,然后作为头像. 代码如下 MainActivity.Java文件: package ...

  3. flutter获取Android照片,Flutter调用Android相机拍照及选取本地相册并渲染

    import 'package:flutter/material.dart'; //导入拍照插件 import 'package:image_picker/image_picker.dart'; // ...

  4. android相册拍照剪切上传封装,安卓,图片裁剪上传真机测试好使,打包后显示:无法保存裁剪的图像...

    var IMAGE_UNSPECIFIED = "image/*"; var PHOTOZOOM = 2; // 获取完图片返回key var PHOTOLAT = 1; // 剪 ...

  5. Android开发 拍照+读取相册+保存到本地

    Android Studio 新建项目,Minimum SDK选择API 28: android 9.0(Pie),在华为Mate20 Pro 测试通过. AndroidManifest.xml中添加 ...

  6. android设置本地图片,Android设置头像,手机拍照或从本地相册选取图片作为头像...

     [Android设置头像,手机拍照或从本地相册选取图片作为头像] 像微信.QQ.微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式: 1,让用户通过选择本地相册之类的图片库中已 ...

  7. Android中保存图片到本地并更新到相册及图片出现在相册时间不正确解决方案

    刚开始保存图片到本地更新相册后时间显示1970年月1日,网上看了好多方案都不用 详细代码: /** * 将URL转化成bitmap形式 * * @param url * @return bitmap ...

  8. android实现拍照、相册选图、裁剪功能,兼容7.0以及小米

    现在一般的手机应用都会有上传头像的功能,我在实现这个功能的时候遇到很多问题,这里专门记录一下. add 2018/5/10 21:05 先列举一下我出现过的问题: 1.运行时权限 2.调用系统相机拍照 ...

  9. android内容提供器读取图片,android实现拍照或从相册选取图片

    从相册或拍照更换图片功能的实现:(取图无裁剪功能) 获取图片方式: (类似更换头像的效果) 1.手机拍照 选择图片: 2.相册选取图片: 本文只是简单实现该功能,页面展示有些简陋,运行效果图如下: 创 ...

最新文章

  1. PHP5 $this self parent static的区别
  2. 设计模式的理解: 代理模式(Proxy)
  3. 为你总结了N个真实线上故障,从容应对面试官!
  4. 《Python编程快速上手 让繁琐工作自动化》pdf
  5. 什么是 DDoS 攻击?
  6. 交通灯keil程序加2位数码管_十字路口交通灯控制Keil编写
  7. 全国企业税收调查数据(2007-2016)共10年数据,均未脱敏。可通过纳税人识别号,识别具体企业名称和地区信息等,可匹配中国工业企业数据库,中国出口海关统计数据、中国企业污染排放数据库、中国海关数据
  8. Java反序列化和JNDI注入
  9. jquery控制下的video视频播放
  10. JSP从入门到精通_课堂实战视频教程
  11. 小米刷机一直在android界面,小米手机变砖怎么办?(小白刷机记)卡在开机怎么办?界面进不去,重启不管用​...
  12. 【VUE3】Hash模式与HTML5模式使用区别
  13. Android11.0(R) MTK6771 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)
  14. 一文看尽 6篇 CVPR2021 伪装目标检测、旋转目标检测论文
  15. #define 和typedef的区别
  16. 大数据管理与应用专业总结笔记
  17. Power bi 4.14 桑基图
  18. ubuntu清除cuda缓存
  19. vba文字型的值转换成数值类型
  20. Redis 3 配置详解

热门文章

  1. Zynq-7000系列Quad-SPI I/O接口简介
  2. ROS小车记录系列(二)IMU采集、过滤,与odom数据融合,发布新的odom话题
  3. 教程 Re:Zero ROS (六)—— 获取编写检验 -> odom坐标系
  4. python测试抽奖脚本_一个小小的抽奖活动测试脚本(python2.7)
  5. android.app.fragment instantiationexception,recreate导致的Fragment报的错误
  6. 【每日新闻】日新干线高铁时速360公里测试 超目前商用高铁最高速
  7. 怎么提高自动化测试的覆盖率
  8. 了解堡垒机价格与哪些方面有关,正确的进行选择
  9. 每日一题-英文字母排序
  10. 计算机组成怎么看进位,计算机组成原理《进位控制实验》