java - 使用 Android Nougat 在 Android Gallery 中显示应用程序图片

标签 java android android-camera

如何授予适当的权限并设置正确的路径,以便使用 Android Nougat 中的 FileProvider 在 native Android Gallery 应用中显示应用照片?

以下是当前代码。它将在本地保存照片,但照片不会显示在 Android Gallery 应用中。

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>

最佳答案

没有单一的“原生 Android Gallery 应用程序”。 Android 设备数量约为 20 亿,分布在数千种设备型号中。这些设备上预装了数百个“图库”应用程序,因为设备制造商通常会发布自己的应用程序。用户还可以从应用市场安装“图库”应用。

他们的行为会有所不同。许多人会使用 MediaStore 来查找要查看的照片。您没有做任何事情来安排您的图像被 MediaStore 索引。在 onActivityResult() 中使用 MediaScannerConnection 及其 scanFile() 方法,让 MediaStore 将其目录更新为包括您的图像。

关于java - 使用 Android Nougat 在 Android Gallery 中显示应用程序图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40868295/

相关文章:

java - 获取 java.net.SocketTimeoutException : Connection timed out in android

java - 从android中的当前 Activity 中删除以前的 Activity

java - 运算符 '+' 不能应用于 'int' , 'java.lang.Object'

java - 警报对话框无法添加窗口错误

android - 从纵向 Activity 中以横向方式打开相机时上下文为空

java - Android - 如何 "invalidate"FragmentPagerAdapter 中的 fragment ?

javascript - 在 Framework7 应用程序中添加用于录音的外部 cordova 插件

java - 可以使用 xml 属性 onClick ="click"更改按钮文本,而无需创建按钮对象

Android SurfaceView 预览模糊

java - 如何以编程方式检查是否启用了地理标记?