我正在为应用编写自定义相机选择器。
这就是我管理相机意图的方式:
@SuppressWarnings("ResultOfMethodCallIgnored")
@NonNull
private Intent getCameraIntent()
{
mCurrentImageFileName = "image" + System.currentTimeMillis() + ".jpg"; // create a default jpg image
File imagesDir = new File( mActivity.getFilesDir(), "images"); // init a images directory creation
imagesDir.mkdirs(); // create images directory
File vFile = new File( imagesDir, mCurrentImageFileName );
try { vFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); }
Intent vCameraIntent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE ); // init the default camera intent
String vAuthority = mActivity.getPackageName() + ".******"; // get path authority ( used to filter a specific folder )
final Uri outputUri;
if( Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT ) { outputUri = Uri.fromFile( vFile ); } // fix kitkat issue
else { outputUri = FileProvider.getUriForFile( mActivity.getApplicationContext(), vAuthority, vFile ); }
vCameraIntent.putExtra( MediaStore.EXTRA_OUTPUT, outputUri );
LogUtils.setDebugLog( "debugOutputUri %s", "output uri is : " + outputUri );
mActivity.grantUriPermission(
"com.google.android.GoogleCamera",
outputUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION
);
return vCameraIntent;
}
以及如何处理结果以获取位图:
Bitmap vBitmap = MediaStore.Images.Media.getBitmap( mActivity.getContentResolver(), vImageUri ); // get bitmap
vImageUri是:
在API> 19中,getBitmap 完美运行,但在API <19中,getBitmap 始终返回null 。
我的应用拥有所需的所有权限
有人可以帮我吗?
答案 0 :(得分:2)
这是来自 Android Developers documentation 的官方解决方案。
private Bitmap getBitmapFromUri(Uri uri) throws IOException {
ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
return image;
}
注意:
<块引用>您应该在后台线程而不是 UI 线程上完成此操作。
答案 1 :(得分:0)
尝试Glide,它在API级别14以上兼容
添加依赖项
Glide.with(this)
.asBitmap()
.load(path)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
imageView.setImageBitmap(resource);
}
});
然后添加您的代码
{{1}}
答案 2 :(得分:0)
另一个位置是内部存储。您可以在下面尝试
[ { property1: '<property-value-1>',
property2: '<property-value-2>',
property3: '<property-value-3>',
property4: '<property-value-4>',
[Symbol(KEY)]:
Key {
namespace: undefined,
id: <'id-value'>,
kind: 'venue',
path: [Getter] } } ]
答案 3 :(得分:0)
我找到了解决这个问题的方法。要获取Uri,您必须使用两种不同的方式:
1-在api 19及以下版本的操作页面上,您必须使用Uri.fromFile()
和
2-对于api> 19,请使用 File Provider 。如果使用此说明,请始终使用
MediaStore.Images.Media.getBitmap() 工作正常,并返回您的位图。