Android调取拍照和获取拍照后的照片



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

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.




猜你喜欢

转载自blog.csdn.net/sinat_31311947/article/details/79667926
今日推荐