需要调取照相机拍照,但是又不想用第三方,自己去写的时候,却发现有很多坑。比如:

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.


更多相关文章

  1. android 获取UTC时间和与.net时间戳的转换
  2. android保存文件到sd卡,读取和清空记录功能(可以用来保存用户名和
  3. android 截屏的三种方法
  4. Android(安卓)存储路径选择方法
  5. SpringBoot webSocket 发送广播、点对点消息,Android接收
  6. Android(安卓)-- 超全的 File,Bitmap,Drawable,Uri, FilePath ,byte
  7. android红米等关于读取本地文件夹图片获取路径的问题的解决
  8. 下拉列表 spinner(android)
  9. android中打开本地doc、pdf、ppt、text等文件功能的实现

随机推荐

  1. android handler正确写法
  2. Android实现手写板和涂鸦功能
  3. Android(安卓)studio引用包冲突
  4. Android(安卓)获得sdcard大小与内存大小
  5. android之WebView的使用
  6. android 类似微信的摇一摇实现
  7. Android创建和删除桌面快捷方式
  8. android view画图笔记-1
  9. Android程序安装和卸载
  10. Android(安卓)Studio 打包apk时遇到的问