Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用文件提供程序将相机照片从片段保存到库_Java_Android_Android Fragments - Fatal编程技术网

Java 使用文件提供程序将相机照片从片段保存到库

Java 使用文件提供程序将相机照片从片段保存到库,java,android,android-fragments,Java,Android,Android Fragments,我正在关注如何将相机拍摄的照片保存到图库中的文档 他们希望您使用getExternalFilesDir创建一个文件 String mCurrentPhotoPath; private File createImageFile() throws IOException { // Create an image file name String imageFileName = "JPEG_" + UUID.randomUUID();

我正在关注如何将相机拍摄的照片保存到图库中的文档

他们希望您使用
getExternalFilesDir
创建一个文件

    String mCurrentPhotoPath;
    private File createImageFile() throws IOException {
        // Create an image file name

         String imageFileName = "JPEG_" + UUID.randomUUID();
        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 = image.getAbsolutePath();
        return image;
    }
mCurrentPhotoPath等于
/storage/emulated/0/Android/data/com.mycompany.myapp/files/Pictures/jpeg22fda6f2-dad9-4dd9-b327-c1130c8df0eb187766077.jpg

但是在下一部分,最重要的部分,将照片添加到图库中

他们说:

如果您将照片保存到 getExternalFilesDir(),媒体扫描程序无法访问这些文件 因为它们对你的应用程序是私有的

这正是他们使用的方法。
getExternalFilesDir()-(

所以我也看了一下上面的。我还不太明白我需要使用哪个目录方法。我尝试了
getFilesDir()
,但它不喜欢
环境。目录图片

但是他们没有提供一种使用他们的方法保存到库中的方法,他们的代码片段不起作用

private void cameraIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            if (photoFile != null) {
                Uri photoURI = FileProvider.getUriForFile(getActivity().getApplicationContext(), "com.mycompany.myapp.fileprovider", photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, REQUEST_CODE_CAPUTURE_IMAGE);
            }
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_CAPUTURE_IMAGE && resultCode == Activity.RESULT_OK) {
                galleryAddPic();

        }
        }

    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);
    }
因此,我的应用程序不会将图片保存到库中。我根本看不到它将图片保存在哪里


有人知道我做错了什么吗?

当您将文件添加到Android的文件系统时,MedaScanner不会自动拾取这些文件,而且Android只在重新启动时运行完全媒体扫描。问题是完全扫描需要很长时间

一种解决方案是使用静态scanFile()方法。如果您只需要知道文件是何时添加的,您可以将的静态方法scanFile()
名称不好,因为它实际上需要一系列路径,因此可以用于一次添加多个文件,而不仅仅是一个文件,但它仍然可以满足我们的需要。 以下是如何使用此方法:

MediaScannerConnection.scanFile(
  getApplicationContext(),
  new String[]{file.getAbsolutePath()},
  null,
  new OnScanCompletedListener() {
     @Override
     public void onScanCompleted(String path, Uri uri) {
        Log.v("grokkingandroid",
              "file " + path + " was scanned seccessfully: " + uri);
     }
  });
以下信息是静态scanFile()方法的参数

  • 上下文:应用程序上下文
  • 路径:包含要添加的文件路径的字符串数组
  • mimeTypes:包含文件mime类型的字符串数组
  • 回调:扫描完成时将通知MediaScannerConnection.OnScanCompletedListener
OnScanCompletedListener本身必须实现onScanCompleted()方法。此方法获取作为参数传入的MediaStore.Files提供程序的文件名和URI


我希望这会有所帮助。

“他们使用的是确切的方法”--文档中的这一段是不正确的。
getExternalFilesDir()
是应用程序特有的,但它不是应用程序的私有内容。“他们的代码片段不起作用”--尝试
MediaScannerConnection
及其
scanFile()
方法。我尝试了这个方法,但照片从未保存到我的相机卷中。