我正在尝试使用标准相机应用拍摄照片并将其保存到只有我的应用可见的存储空间。
public void startCamera(View view)
{
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null)
{
File imageFile = null;
try
{
imageFile = createImageFile();
}
catch (IOException ex)
{
ex.printStackTrace();
}
if(imageFile != null)
{
Uri imageUri = FileProvider.getUriForFile(this, "vasiljevic.filip.secretnotes", imageFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(takePictureIntent, 1);
}
}
}
createImageFile方法:
private File createImageFile() throws IOException
{
String timeStamp = new SimpleDateFormat("yyyyddMM_HHmmss").format(new Date());
EditText editText = (EditText) findViewById(R.id.txtNoteName);
String noteName = editText.getText().toString();
String imageFileName = noteName + "_" + timeStamp;
File storageDir = new File(getFilesDir(), "images");
if(!storageDir.exists())
{
storageDir.mkdir();
}
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
return image;
}
这是包含FileProvider的清单的一部分:
<provider
android:authorities="vasiljevic.filip.secretnotes"
android:name="android.support.v4.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
和file_paths.xml:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="my_images" path="images/"/>
</paths>
拍摄照片后,如果我在模拟器上运行它,或者“画廊已经停止”,如果我在真实设备上运行它,则会显示“相机已停止”的消息。稍后,如果我尝试使用ACTION_VIEW意图访问它,它会说“无法打开图像”,如果我在真实设备上尝试它,或者如果我在模拟器上尝试它,就好像它已打开图像但屏幕全黑并且没有显示真实的图像。
我做得对吗?这段代码应该正确保存图像吗?它主要基于拍摄照片,只需官方的android教程:Taking photos simply
答案 0 :(得分:3)
将FLAG_GRANT_WRITE_URI_PERMISSION
添加到Intent
。目前,您的第三方应用无权将照片保存到Uri
。
如果您支持的时间早于Android 5.0 you might also need to use a ClipData
workaround,则Intent
标记不会影响旧版Android上的EXTRA_OUTPUT
。