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