neo*_*neo 5 android uri android-camera android-fileprovider
我想要实现什么?我想获取捕获图像的URI并将其保存在Firebase上.我尝试了什么?首先,我需要打开相机.以下是我的表现:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null)
startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
捕获图像后,我需要获取图像的URI.以下是我的表现:
if (resultCode == Activity.RESULT_OK) {
if (requestCode == CAMERA_REQUEST_CODE) {
if (data != null) {
if (data.getData() != null) {
Uri capturedImageUri = data.getData();
} else {
Toast.makeText(getContext(), getString(R.string.coudldnt_get_photo), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getContext(), getString(R.string.coudldnt_get_photo), Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
一切都很好.但仅限于某些设备.我认为它仅适用于超过21个设备的API级别.在其他设备中,getData()返回null.
那么,接下来我做了什么?我发现我可以通过以下代码获取图像的Bitmap:
Bitmap bitmap = (Bitmap)data.getExtras().get("data") ;
Run Code Online (Sandbox Code Playgroud)
所以,我有一个图像的位图.我需要获取此图像的URI.以下是我的表现:
public Uri getImageUri(Context inContext, Bitmap inImage) {
String path =
Images.Media.insertImage(inContext.getContentResolver(), inImage,
"Title", null);
return Uri.parse(path);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码返回我的URI,但图像质量非常差.
所以,我一直在寻找解决方案.并且发现正确的方法是在我启动时创建文件CameraActivity并保存该文件的uri.而onActivityResult我试图让这个URI.以下是我的表现:
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
}
if (photoFile != null) {
Uri photoUri = FileProvider.getUriForFile(getContext(), "i_dont_know_what_to_write_here", photoFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
}
}
Run Code Online (Sandbox Code Playgroud)
我onActivityResult成了:
if (resultCode == Activity.RESULT_OK) {
if (requestCode == CAMERA_REQUEST_CODE) {
if (data != null) {
Uri capturedPhotoUri =
data.getParcelableExtra(MediaStore.EXTRA_OUTPUT);
} else {
Toast.makeText(getContext(),
getString(R.string.coudldnt_get_photo), Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
以上概念需要在清单上添加一些标签:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="i_dont_know_what_to_write_here"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/my_paths" />
</provider>
Run Code Online (Sandbox Code Playgroud)
我的xml文件是:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path name="images"/>
</paths>
Run Code Online (Sandbox Code Playgroud)
上面的方法不起作用,因为dataon onActivityReuslt为null.
那么,为了实现我的目标,我需要做些什么呢?
小智 10
按照以下步骤.
步骤1:在res/xml文件夹中创建provider_paths.xml并在其中写下代码.
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="external_files"
path="." />
</paths>
Run Code Online (Sandbox Code Playgroud)
步骤2:在清单中声明提供者,如下所示.
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
Run Code Online (Sandbox Code Playgroud)
步骤3:将您的相机意图写入如下.
Intent m_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory(), "MyPhoto.jpg");
Uri uri = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", file);
m_intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(m_intent, REQUEST_CAMERA_IMAGE);
Run Code Online (Sandbox Code Playgroud)
步骤4:在onActivityResult中处理相机结果,如下所示.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
//TODO... onCamera Picker Result
case REQUEST_CAMERA_IMAGE:
if (resultCode == RESULT_OK) {
//File object of camera image
File file = new File(Environment.getExternalStorageDirectory(), "MyPhoto.jpg");
//Uri of camera image
Uri uri = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", file);
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
在调用相机意图时
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "IMG_FOLDER");
try {
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
return null;
}
}
} catch (Exception e) {
e.printStackTrace();
}
imageURI = Uri.fromFile(new File(mediaStorageDir.getPath() + File.separator +
"profile_img.jpg"));
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageURI);
startActivityForResult(intent, Utils.CAMERA_REQUEST);
Run Code Online (Sandbox Code Playgroud)
在 onActivityResult 里面
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
if (resultCode == RESULT_OK) {
if (requestCode == Utils.CAMERA_REQUEST) {
if (imageURI != null) { // use the same uri, that you initialized while calling camera intent
// do whatever you want to do with this Uri
}
}
}
} catch(Exception E) {}
}
Run Code Online (Sandbox Code Playgroud)
对于牛轧糖,您需要在启动/启动器活动中添加以下代码
if (Build.VERSION.SDK_INT >= 24) {
try {
Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
m.invoke(null);
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
这将适用于所有版本。我也测试过了。
| 归档时间: |
|
| 查看次数: |
6847 次 |
| 最近记录: |