Android获取本地相册图片和拍照获取图片的实现方法

Android获取本地相册图片和拍照获取图片的实现方法

2023年7月7日发(作者:)

Android获取本地相册图⽚和拍照获取图⽚的实现⽅法需求:从本地相册找图⽚,或通过调⽤系统相机拍照得到图⽚。容易出错的地⽅:1、当我们指定了照⽚的uri路径,我们就不能通过a();来获取uri,⽽应该直接拿到uri(⽤全局变量或者其他⽅式)然后设置给geURI(uri);2、我发现⼿机前置摄像头拍出来的照⽚只有⼏百KB,直接⽤geURI(uri);没有很⼤问题,但是后置摄像头拍出来的照⽚⽐较⼤,这个时候使⽤geURI(uri);就容易出现 out of memory(oom)错误,我们需要先把URI转换为Bitmap,再压缩bitmap,然后通过geBitmap(bitmap);来显⽰图⽚。3、将照⽚存放到SD卡中后,照⽚不能⽴即出现在系统相册中,因此我们需要发送⼴播去提醒相册更新照⽚。4、这⾥⽤到了sharepreference,要注意⽤完之后移除缓存。代码:MainActivity:package ;import ;import ;import Factory;import ;import ;import nment;import tore;import patActivity;import ;import ;import iew;import ools;import ;import ption;import DateFormat;import ;public class MainActivity extends AppCompatActivity { private static final int PHOTO_FROM_GALLERY = 1; private static final int PHOTO_FROM_CAMERA = 2; private ImageView imageView; private File appDir; private Uri uriForCamera; private Date date; private String str = ""; private SharePreference sharePreference; @Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_main); //Android不推荐使⽤全局变量,我在这⾥使⽤了sharePreference sharePreference = tance(this); imageView = (ImageView) findViewById(iew); } //从相册取图⽚ public void gallery(View view) { Intent intent = new Intent(); e("image/*"); ion(_GET_CONTENT); startActivityForResult(intent, PHOTO_FROM_GALLERY); } //拍照取图⽚ public void camera(View view) { Intent intent = new Intent(_IMAGE_CAPTURE); uriForCamera = le(createImageStoragePath()); he("uri", f(uriForCamera));

/** * 指定了uri路径,startActivityForResult不返回intent, * 所以在onActivityResult()中不能通过a()获取到uri; */ ra(_OUTPUT, uriForCamera); startActivityForResult(intent, PHOTO_FROM_CAMERA); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { vityResult(requestCode, resultCode, data); //第⼀层switch switch (requestCode) { case PHOTO_FROM_GALLERY: //第⼆层switch switch (resultCode) { case RESULT_OK: if (data != null) { Uri uri = a(); geURI(uri); } break; case RESULT_CANCELED: break; } break; case PHOTO_FROM_CAMERA: if (resultCode == RESULT_OK) { Uri uri = (ing("uri")); updateDCIM(uri); try { //把URI转换为Bitmap,并将bitmap压缩,防⽌OOM(out of memory) Bitmap bitmap = mapFromUri(uri, this); geBitmap(bitmap); } catch (IOException e) { tackTrace(); } removeCache("uri"); } else { Log.e("result", "is not ok" + resultCode); } break; default: break; } } /** * 设置相⽚存放路径,先将照⽚存放到SD卡中,再操作 * * @return */ private File createImageStoragePath() { if (hasSdcard()) { appDir = new File("/sdcard/testImage/"); if (!()) { (); } SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); date = new Date(); str = (date); String fileName = str + ".jpg"; File file = new File(appDir, fileName); return file; } else { Log.e("sd", "is not load"); return null; } }

/** * 将照⽚插⼊系统相册,提醒相册更新 * * @param uri */ private void updateDCIM(Uri uri) { Intent intent = new Intent(_MEDIA_SCANNER_SCAN_FILE); a(uri); oadcast(intent); Bitmap bitmap = File(h()); Image(getContentResolver(), bitmap, "", ""); } /** * 判断SD卡是否可⽤ * * @return */ private boolean hasSdcard() { if (ernalStorageState().equals(_MOUNTED)) { return true; } else { return false; } } /** * 移除缓存 * * @param cache */ private void removeCache(String cache) { if (Share(cache)) { OneCache(cache); } else { Log.e("this cache", "is not exist."); } }}ImageTools:package ;import ty;import ;import Factory;import ;import rayInputStream;import rayOutputStream;import tFoundException;import ption;import tream;public class ImageTools { /** * 通过uri获取图⽚并进⾏压缩 * * @param uri * @param activity * @return * @throws IOException */ public static Bitmap getBitmapFromUri(Uri uri, Activity activity) throws IOException { InputStream inputStream = tentResolver().openInputStream(uri); s options = new s(); DecodeBounds = true; er = true; erredConfig = _8888; Stream(inputStream, null, options); (); int originalWidth = th; int originalHeight = ght; if (originalWidth == -1 || originalHeight == -1) { return null; } float height = 800f; float width = 480f; int be = 1; //be=1表⽰不缩放 if (originalWidth > originalHeight && originalWidth > width) { be = (int) (originalWidth / width); } else if (originalWidth < originalHeight && originalHeight > height) { be = (int) (originalHeight / height); } if (be <= 0) { be = 1; } s bitmapOptinos = new s(); leSize = be; er = true; erredConfig = _8888; inputStream = tentResolver().openInputStream(uri); Bitmap bitmap = Stream(inputStream, null, bitmapOptinos); (); return compressImage(bitmap); } /** * 质量压缩⽅法 * * @param bitmap * @return */ public static Bitmap compressImage(Bitmap bitmap) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ss(, 100, byteArrayOutputStream); int options = 100; while (Array().length / 1024 > 100) { (); //第⼀个参数 :图⽚格式 ,第⼆个参数: 图⽚质量,100为最⾼,0为最差 ,第三个参数:保存压缩后的数据的流 ss(, options, byteArrayOutputStream); options -= 10; } ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(Array()); Bitmap bitmapImage = Stream(byteArrayInputStream, null, null); return bitmapImage; }}: activity_:

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信