由app拍摄的照片不保存在画廊中

时间:2016-08-12 15:25:48

标签: android android-camera

直接在我的应用上拍照时,我在app目录中保存照片时遇到问题(例如whatsapp示例)。

在我的清单中,我设置了这些许可证:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.myapp.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true"
        android:readPermission="com.myapp.READ">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths"/>
    </provider>

</application>

在我的活动中,我有:

public void showCamera(View v){
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        if (intent.resolveActivity(getPackageManager()) != null) {
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {

            }

            if (photoFile != null) {
                Uri photoURI = FileProvider.getUriForFile(this,
                        "com.myapp.fileprovider",
                        photoFile);

                intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);

                startActivityForResult(intent, REQUEST_TAKE_PHOTO);
                galleryAddPic();
            }
        }
    }

    String mCurrentPhotoPath;


    private void galleryAddPic() {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(mCurrentPhotoPath);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
    }
    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = "file:" + image.getAbsolutePath();
        return image;
    }

在我的filePath资源中:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/data/com.myapp/files/Pictures" />

它打开相机,拍照并返回我的活动,但我无法在任何地方找到它,所以看起来不能保存照片。

2 个答案:

答案 0 :(得分:1)

如果一切正常,则将galleryAddPic()方法放在onActivityResult中,在那里收集捕获的图片。

答案 1 :(得分:0)

  

我无法在任何地方找到它

你没有说明你是如何寻找它的。使用adb shell可以查看文件系统级别的设备或模拟器上的内容。

目前,您的ACTION_MEDIA_SCANNER_SCAN_FILE将无效,因为您使用的是无效路径。文件系统路径不以file:开头。我建议完全删除mCurrentPhotoPath并保留createImageFile()返回的文件,将其与ACTION_MEDIA_SCANNER_SCAN_FILE请求一起使用(或使用MediaScannerConnection.scanFile()代替ACTION_MEDIA_SCANNER_SCAN_FILE })。

另外,正如Hardik所说,你过早地打电话给galleryAddPic()。等到galleryAddPic()中调用onActivityResult(),然后等待拍摄照片。虽然文件应该在您现在调用galleryAddPic()时存在,但它将没有正确的详细信息(例如,文件大小)。这可能会使用户感到困惑。你最好等到画面准备好,然后要求将它编入索引。