繁体   English   中英

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

[英]Show apps pictures in Android Gallery with Android Nougat

您如何授予适当的权限并设置正确的路径,以便在Android Nougat中使用FileProvider在原生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应用”。 大约有20亿个Android设备,分布在数千种设备型号中。 这些设备上有数百个预装的“图库”应用程序,因为设备制造商通常会自己运送它们。 也有“图库”应用可供用户从应用市场安装。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM