Android调取拍照和获取拍照后的照片
16lz
2021-01-26
需要调取照相机拍照,但是又不想用第三方,自己去写的时候,却发现有很多坑。比如:
1、拍完照后,如何获取照片?
2、照片获取不到是什么原因?
@ContentView(R.layout.activity_main)public class MainActivity extends BaseActivity { Uri saveUri; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); saveUri = Uri.fromFile(new File(getExternalFilesDir(Environment.DIRECTORY_DCIM),"test.jpg")); } @Event(R.id.bt_photo) private void photo(View view){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); /** * 1、注意这里,如果指定了Uri,则在onActivityResult中的 intent data 将返回null * 2、如果不指定Uri的话,将可以在onActivityResult中 通过data.getParcelableExtra("data")获取bitmap对象, * 而这个bitmap对象是被压缩的,非常模糊,我想这不是我们想要的 * 3、也有的地方说,没有指定Uri 则会默认保存,然后通过Uri.getData()就可以获得这个图片的Uri。但是我测试了一下模拟器和真机都 * 不是这样的 ,是上述1,2两种情况。可能与手机有关,所以用上述两种方法比较靠谱。 */ intent.putExtra(MediaStore.EXTRA_OUTPUT,saveUri); startActivityForResult(intent,0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 0 && resultCode == RESULT_OK){ if(data != null){ //获取图片路径 Uri uri = data.getData(); /** * 有些手机上通过getData()获取不到相关Uri,有的获取的到,上面已做解释。 * 能获取到Uri的 需要通过Uri找到数据库中对应的数据,再取到真实路径。 * 获取不到的需要通过data.getParcelableExtra("data")取到bitmap,自己存储 */ if(uri != null){ //取得Uri的真实路径,我没有很多机型,所以没测试出这种的 Cursor query = getContentResolver().query(uri, new String[]{"_data"}, null, null, null); if (query.moveToFirst()){ query.moveToNext(); String path = query.getString(0); } }else { //取的被压缩的bitmap,应该不是我们想要的 Bitmap bitmap = (Bitmap) data.getParcelableExtra("data"); } } //通知相册更新,我测试了一下,在模拟器上,发了也没用。。在真机上,不发也能从相册看到。 sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,saveUri)); } } }
总结:综上述来说,我们最好自己制定Uri,这样图片既不会失真,又不会又其他的问题,就是需要注意的是,既然制定了Uri,就不会要在onActivityResult中去取了,那是intent也将会是null.
更多相关文章
- android 获取UTC时间和与.net时间戳的转换
- android保存文件到sd卡,读取和清空记录功能(可以用来保存用户名和
- android 截屏的三种方法
- Android(安卓)存储路径选择方法
- SpringBoot webSocket 发送广播、点对点消息,Android接收
- Android(安卓)-- 超全的 File,Bitmap,Drawable,Uri, FilePath ,byte
- android红米等关于读取本地文件夹图片获取路径的问题的解决
- 下拉列表 spinner(android)
- android中打开本地doc、pdf、ppt、text等文件功能的实现