2016-11-29 12 views
0

Android NougatのFileProviderを搭載したネイティブAndroid Galleryアプリでアプリの写真を表示するには、適切な権限を与えて正しいパスを設定するにはどうすればよいですか?Android Nougatを搭載したAndroidギャラリーにアプリケーション写真を表示

以下は現在のコードです。写真はローカルに保存されますが、写真はAndroid Galleryアプリに表示されません。

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 Galleryアプリ"ではありません。何千ものデバイスモデルに分散している約20億のAndroidデバイスがあります。デバイスメーカーが定期的に自社の製品を出荷しているため、これらのデバイスには数多くのプリインストールされた「ギャラリー」アプリがあります。ユーザーがアプリ市場からインストールできる「ギャラリー」アプリもあります。

その動作はさまざまです。多くの人がMediaStoreを使用して表示する写真を見つけます。 MediaStoreで画像のインデックスを作成する手配は何もしていません。 onActivityResult()MediaScannerConnectionとそのscanFile()メソッドを使用して、MediaStoreに画像を含むカタログを更新させるようにしてください。

+0

私はそれを呼び出すことができ、 'onScanCompletedListener'コールバックは成功しました。私はまだギャラリーでイメージを見ることはありません。同期するのに時間がかかりますか?また、これは私のファイルパスです: 'content:// com.myapp.myapp.provider/Myapp/Pictures/Myapp/IMG_20161129_073601.jpg'これはギャラリーアプリケーションが検出する有効なファイルパスだとしていますか?手伝ってくれてどうもありがとう。 Androidで学ぶことは大いにありますが、簡単に立ち往生することができます。 –

+1

@AaronLelevier: "これは私のファイルパスです" - これはファイルパスではありません。 「これはGalleryアプリケーションで検出される有効なファイルパスだとしていますか? - いいえ。これはあなたの 'FileProvider'を指し示す' Uri'です。ファイルパスは 'photoFile'オブジェクトにあります。設定の変更を含め、この値を保持する必要があります(たとえば、onSaveInstanceState()を使用)。また、 'scanFile()'コールで 'photoFile'のファイルパスを使う必要があります。 – CommonsWare

関連する問題