0
如何授予適當的權限並設置正確的路徑,以便在Android Nougat中使用FileProvider在原生Android Gallery應用中顯示應用照片?使用Android Nougat在Android圖庫中顯示應用圖片
以下是當前的代碼。它會在本地保存照片,但照片不會顯示在Android圖庫應用中。
CameraActivity.java
public class CameraPreviewActivity extends AppCompatActivity
implements CameraPreviewFragment.Callback {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
showCamera();
}
public void showCameraPreviewFile() {
_photoFileUri = generateTimestampPhotoUri();
if (_photoFileUri != null) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, _photoFileUri);
startActivityForResult(intent, PHOTO_INTENT_WITH_FILENAME);
}
}
File getPhotoDirectory() {
File outputDir = null;
String externalStorageState = Environment.getExternalStorageState();
if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) {
File picturesDir =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
outputDir = new File(picturesDir, getString(R.string.app_name));
if (!outputDir.exists()) {
if (!outputDir.mkdirs()) {
Log.e(LOG_TAG, "outputDir.mkdirs: error");
outputDir = null;
}
}
}
return outputDir;
}
Uri generateTimestampPhotoUri() {
Uri photoUri = null;
File outputDir = getPhotoDirectory();
File photoFile = null;
if (outputDir != null) {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String photoFileName = "IMG_" + timeStamp + ".jpg";
photoFile = new File(outputDir, photoFileName);
}
if (photoFile != null) {
photoUri = FileProvider.getUriForFile(
this,
this.getApplicationContext().getPackageName() + ".provider",
photoFile
);
}
return photoUri;
}
的AndroidManifest.xml
<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" />
XML/provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="MyApp" path="."/>
</paths>
我可以調用它,並且'onScanCompletedListener'回調成功。但是我沒有看到圖庫中的圖像。是否需要一段時間才能同步?另外,這是我的文件路徑:'content:// com.myapp.myapp.provider/Myapp/Pictures/Myapp/IMG_20161129_073601.jpg'我假設這是一個由Gallery應用程序發現的有效文件路徑?非常感謝你的幫助。在Android中學習有很多東西,感覺很容易陷入困境。 –
@AaronLelevier:「這是我的文件路徑」 - 這不是文件路徑。 「我假設這是一個有效的文件路徑被Gallery應用程序發現?」 - 沒有。這是一個'Uri'指向你的'FileProvider'。你的文件路徑在'photoFile'對象中。你需要保持這個值,包括跨配置改變(例如,使用'onSaveInstanceState()')。你需要在'scanFile()'調用中使用'photoFile'中的文件路徑。 – CommonsWare