2016-11-29 3 views
0

Android Nougat의 FileProvider가있는 기본 Android 갤러리 앱에 앱 사진을 표시하려면 적절한 권한을 설정하고 정확한 경로를 어떻게 설정합니까?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에 의해 너의 심상이 색인이 붙도록 준비하는 것을 아무것도하지 않고있다. onActivityResult()MediaScannerConnection 및 그 scanFile() 방법을 사용하여 이미지를 포함하도록 MediaStore 카탈로그를 업데이트하십시오.

+0

나는 그것을 호출 할 수 있었고,'onScanCompletedListener' 콜백이 성공했다. 나는 아직 갤러리에서 이미지를 보지 못했다. 동기화하는 데 시간이 걸립니까? 또한 이것은 내 파일 경로입니다 :'content : // com.myapp.myapp.provider/Myapp/Pictures/Myapp/IMG_20161129_073601.jpg' 이것은 갤러리 응용 프로그램에서 발견 할 수있는 유효한 파일 경로라고 가정합니다. 도와 주셔서 정말 감사합니다. 안드로이드에서 배워야 할 것이 많기 때문에 쉽게 붙잡을 수 있습니다. –

+1

@AaronLelevier : "이것은 내 파일 경로입니다"- 파일 경로가 아닙니다. "갤러리 앱이 발견 할 수있는 유효한 파일 경로라고 생각하고 있습니까?" -- 아니. 그것은'FileProvider'를 가리키는'Uri'입니다. 파일 경로는'photoFile' 객체에 있습니다. 구성 변경을 포함하여이 값을 유지해야합니다 (예 : onSaveInstanceState() 사용). 그리고'scanFile()'호출에서'photoFile'의 파일 경로를 사용해야합니다. – CommonsWare

관련 문제