2016-11-29 76 views
0

如何授予適當的權限並設置正確的路徑,以便在Android Nougat中使用FileProvider在原生Android Gallery應用中顯示應用照片?使用Android Nougat在Android圖庫中顯示應用圖片

以下是當前的代碼。它會在本地保存照片,但照片不會顯示在Android圖庫應用中。

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> 

回答

2

有沒有單一的「原生Android畫廊應用程序」。有大約20億個Android設備,分佈在數千種設備模型中。這些設備上有數百個預先安裝的「圖庫」應用程序,因爲設備製造商通常會自行發貨。還有「畫廊」應用程序可供用戶從應用程序市場安裝。

他們的行爲會有所不同。許多人會用MediaStore找到要查看的照片。你沒有做任何事情來安排讓你的圖像索引MediaStore。使用MediaScannerConnection及其scanFile()方法,在onActivityResult()中,讓MediaStore更新其目錄以包含圖像。

+0

我可以調用它,並且'onScanCompletedListener'回調成功。但是我沒有看到圖庫中的圖像。是否需要一段時間才能同步?另外,這是我的文件路徑:'content:// com.myapp.myapp.provider/Myapp/Pictures/Myapp/IMG_20161129_073601.jpg'我假設這是一個由Gallery應用程序發現的有效文件路徑?非常感謝你的幫助。在Android中學習有很多東西,感覺很容易陷入困境。 –

+1

@AaronLelevier:「這是我的文件路徑」 - 這不是文件路徑。 「我假設這是一個有效的文件路徑被Gallery應用程序發現?」 - 沒有。這是一個'Uri'指向你的'FileProvider'。你的文件路徑在'photoFile'對象中。你需要保持這個值,包括跨配置改變(例如,使用'onSaveInstanceState()')。你需要在'scanFile()'調用中使用'photoFile'中的文件路徑。 – CommonsWare

相關問題