2016-08-12 190 views
0

我在保存照片時出現問題,在應用程序目錄中(如示例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; 
    } 

在我的文件路徑資源:

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

它打開相機,拍攝照片並返回我的活動,但我無法在任何地方找到它,所以看起來不保存照片。

回答

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()。等待拍攝照片,通過onActivityResult()調用galleryAddPic()。雖然文件應存在於您現在調用galleryAddPic()時的位置,但它不會具有正確的詳細信息(例如文件大小)。這可能會混淆用戶。你最好等待,直到圖片準備好,然後要求它被索引。

+0

好吧,我把'galleryAddPic()'放在'onActivityResult'的Override上,但沒有任何改變。 我有'CreateImageFile()'和'galleryAddPic()'我有'Uri contentUri = Uri.fromFile(photoFile);' 返回的文件可能是sendBroadcast的問題? – LorenzoBerti

+0

@LorenzoBerti:「可能是sendBroadcast有問題嗎?」 - 使用'adb shell'來查看圖像是否存在,你要求它被保存。如果完整的照片存在,那麼媒體掃描邏輯會出現問題。如果文件存在,但是它是空的,那麼圖像捕獲邏輯就會出錯('createTempFile()'會創建一個空文件)。如果該文件不在那裏,那麼你的代碼沒有被運行。 – CommonsWare

+0

Thankyou,我在Android/data/com.myapp/files /圖片中看到照片,但重新啓動後,但不在畫廊中,如何刷新媒體並將其放入媒體庫中? – LorenzoBerti

1

如果一切正常,然後將galleryAddPic()方法放入onActivityResult中,您可以在其中收集捕獲的圖片。

相關問題