调用相册和相机:
调用相机:
1.创建一个文件地址:
File outImage = new File(getExternalCacheDir(), "output_image.jpg");
Log.d("wang", outImage.toString());
try {
if (outImage.exists()) {
outImage.delete();
}
//如果不存在,就直接创建
outImage.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
2.通过文件地址,得到图片的uri:
如果是大于安卓7.0的版本,则需要通过内容提供者,得到一个安全封装的uri
否则直接使用Uri的静态方法,返回一个uri
3.利用隐式意图,启动活动:
直接将action放在构造器里面:
Intent in = new Intent("android.media.action.IMAGE_CAPTURE");
in.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(in, TAKE_PHOTO);
启动活动,此时的活动就是系统的活动。
4.在onActivityResult回调方法中,进行文件读取操作:
获取位图对象,展示在控件里面。
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//
if (requestCode == TAKE_PHOTO) {
if (resultCode == RESULT_OK) {
Bitmap b = null;
try {
b = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
imageView.setImageBitmap(b);
} else {
Toast.makeText(this, "用户取消了选择", Toast.LENGTH_SHORT).show();
}
}
}
onActivityResult方法的参数:
requestCode (
int
):这是你传递给startActivityForResult
的请求代码。它用于标识你启动的是哪个Activity,因此,当结果返回时,你可以据此判断是从哪个Activity返回的结果,尤其是当同一个Activity中使用多次startActivityForResult
时。resultCode (
int
):这是返回的结果代码,用于标识操作是成功还是取消。常用的结果代码有:
Activity.RESULT_OK
:操作成功。Activity.RESULT_CANCELED
:操作被用户取消。data (
Intent
):这是一个包含返回数据的Intent对象。你可以从中获取你需要的数据。如果被启动的Activity想返回数据,它会在Intent中放入数据,然后在它自己的finish()
方法之前设置结果码。
注意在Manifest文件中,因为此处使用了系统相机的内容提供者,提供照片的uri。
调用相册选择照片:
1.打开相册活动
通过隐式活动:
Intent in = new Intent(Intent.ACTION_GET_CONTENT);
in.setType("image/*");
intentActivityResultLauncher.launch(in);
注册一个,
2.选择一张照片,通过意图,得到图片的uri资源:
intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == RESULT_OK) {
Intent intent = result.getData();
Uri u = intent.getData();
if (intent.getData() != null) {
iv.setImageURI(u);
}
}
}
});
通过此回调方法,获系统活动返回的数据,也就是照片的uri。
将其设置到控件上即可。
思考:
获取手机中视频,照片,音乐,等数据都可以通过什么方法?
简单叙述:Uri资源符,文件读取,Bitmap中Stream流,MediaStore API