2017-03-24 43 views
1

我關於如何保存圖片使用相機拍攝到畫廊Googles Official文檔按照順序。保存相機照片到相冊從片段使用文件提供

他們希望你能創建使用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/JPEG_22fda6f2-dad9-4dd9-b327-c1130c8df0eb187766077.jpg

但在第二天部分,最重要的部分,添加照片至圖庫

他們說:

如果您將照片保存到 ge提供的目錄中tExternalFilesDir(),媒體掃描器無法訪問文件 ,因爲它們對您的應用程序是私人的。

這是他們使用的確切方法getExternalFilesDir()。 :-(

所以我看着documentation上了。我不明白不夠好,還沒有搞清楚,我需要使用哪個目錄的方法。我試圖getFilesDir(),但它不喜歡的Environment.DIRECTORY_PICTURES

但是他們不提供的方式使用他們的方法來保存到畫廊,他們的代碼片段不起作用

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); 
    } 

所以我的應用程序不會將圖片保存到畫廊。我不」看看它在哪裏保存它。

任何人都知道我做錯了什麼?

+0

「這是他們使用的確切方法」 - 文檔中的內容不正確。 'getExternalFilesDir()'對您的應用程序是* unique *,但對您的應用程序不是* private *。 「他們的代碼段不起作用」 - 嘗試「MediaScannerConnection」及其scanFile()方法。 – CommonsWare

+0

我試過了,照片從未保存到我的相機膠捲中。 –

回答

0

當您將文件添加到Android的文件系統,這些文件不會被自動MedaScanner回升,還運行Android全媒體掃描僅在重新啓動。問題是全面掃描需要很長時間。

的一個解決方案是使用靜態SCANFILE()方法。如果您只需要知道何時添加了文件,則可以使用MediaScannerConnection的靜態方法scanFile()以及MediaScannerConnection.OnScanCompletedListener。靜態方法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()方法的參數。

  • 上下文:應用程序上下文
  • 路徑:包含MIME類型中的文件的字符串數組:包含要添加
  • MIMETYPES的文件的路徑字符串數組
  • 回調:掃描完成時將被通知的MediaScannerConnection.OnScanCompletedListener

OnScanCompletedListener本身必須實現onScanCompleted()方法。此方法獲取文件名和提供商作爲參數傳入的MediaStore.Files的URI。

我希望這會有所幫助。

相關問題