自己用过很多次,却没有写过,至今仍有一个10.0ImageVew图片没展示出来,但是在7.0的模拟机上是可以拿到的,如果不纠结显示,路径是都拿到了的。
build.grale中引入库
implementation 'com.github.bumptech.glide:glide:4.8.0' //glide 图片加载
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
implementation 'pub.devrel:easypermissions:1.3.0' //动态权限申请库
在AndroidManifest中添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.CAMERA" />
在AndroidManifest中 ,7.0后FileProvider的使用 (authorities 传包名)
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.myapplication.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths">
</meta-data>
</provider>
在res文件夹下建一个provider_paths.xml文件
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
在MainActivity中
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView ivTest;
private Button btnOpenAlbum;
private Button btnOpenCamera;
private String photoPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnOpenCamera = findViewById(R.id.btn_open_camera);
btnOpenAlbum = findViewById(R.id.btn_open_album);
ivTest = findViewById(R.id.iv_show);
btnOpenCamera.setOnClickListener(this);
btnOpenAlbum.setOnClickListener(this);
getPermission();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_open_camera:
goCamera();
break;
case R.id.btn_open_album:
goPhotoAlbum();
break;
}
}
private String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
//获取权限
private void getPermission() {
if (EasyPermissions.hasPermissions(this, permissions)) {
//已经打开权限
Toast.makeText(this, "已经申请相关权限", Toast.LENGTH_SHORT).show();
} else {
//没有打开相关权限、申请权限
EasyPermissions.requestPermissions(this, "需要获取您的相册、照相使用权限", 1, permissions);
}
}
//激活相册操作
private void goPhotoAlbum() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 2);
}
private File cameraSavePath;//拍照照片路径
private Uri uri;//照片uri
//激活相机操作
private void goCamera() {
cameraSavePath = new File(Environment.getExternalStorageDirectory().getPath() + "/" + System.currentTimeMillis() + ".jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//第二个参数为 包名.fileprovider
uri = FileProvider.getUriForFile(MainActivity.this,
"com.example.myapplication.fileprovider", cameraSavePath);//这里传你应用的包名
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
uri = Uri.fromFile(cameraSavePath);
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
MainActivity.this.startActivityForResult(intent, 1);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//框架要求必须这么写
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Toast.makeText(this, "请求成功", Toast.LENGTH_LONG);
switch (requestCode) {
case 1:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
photoPath = String.valueOf(cameraSavePath);
} else {
photoPath = uri.getEncodedPath();
}
Log.d("====", "拍照返回图片路径:" + photoPath);
Glide.with(MainActivity.this).load(photoPath).into(ivTest);
break;
case 2:
photoPath = getPhotoFromPhotoAlbum.getRealPathFromUri(this, data.getData());
Log.d("====", "相册返回图片路径photoPath:" + photoPath);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(photoPath, options);
ivTest.setImageBitmap(bitmap);
Glide.with(this).load(photoPath).into(ivTest);
break;
}
}
}}
网友评论