6

Universal Image Loader을 사용하는 앱에서 인터넷에서 사진을 다운로드하고 data/data/com.myapp/cache에 캐시하고 ImageViews에 표시합니다. FileProvider를 사용하여 캐시 된 이미지 공유

나는 또한 내 애플 리케이션에 (또는 WhatsApp, 페이스 북, 인스 타 그램, 보관 등) 공유를 추가하고 싶었다, 그래서 나는이 코드를 사용하려고 :

Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_STREAM, photoUri); 
intent.setType("image/jpeg"); 
startActivity(Intent.createChooser(intent, "Share image")); 

photoUri 캐시 폴더의 URI이었다 다른 애플 리케이션 읽을 권한이 없습니다.

Google 검색/stackoverflowed 및 found out FileProvider를 사용해야합니다.

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="com.myapp.fileprovider" 
    android:exported="false" 
    android:grantUriPermissions="true"> 
    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/file_paths" /> 
</provider> 

그리고 file_paths.xml : 내 매니페스트에 (as was written here)를 다음과 같이

내가 FileProvider을 구성

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <cache-path name="photo_cache" path="/"/> 
</paths> 

그럼 버튼 OnClickListener를 내 활동에 다음 코드를 사용합니다 :

File photoFile = ImageLoader.getInstance().getDiscCache().get("HTTP LINK HERE"); 
// returns File of "/data/data/com.myapp/cache/-1301123243" 
Uri photoUri = FileProvider.getUriForFile(MyActivity.this, "com.myapp.fileprovider", photoFile); 
// returns Uri of "content://com.myapp.fileprovider/photo_cache/-1301123243" 
photoUri = Uri.parse(photoUri.toString() + ".jpg"); 
// then I add .jpg to file name 

// Create intent 
Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_STREAM, photoUri); 
intent.setType("image/jpeg"); 

// Grant permissions to all apps that can handle this intent 
// thanks to this answer http://stackoverflow.com/a/18332000 
List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
for (ResolveInfo resolveInfo : resInfoList) { 
    String packageName = resolveInfo.activityInfo.packageName; 
    grantUriPermission(packageName, photoUri, 
     Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
} 

// And start 
startActivity(Intent.createChooser(intent, "Share image")); 

그러나 앱에 따라 이상한 예외가 발생합니다. . 이 같은

1974-1974/com.whatsapp W/Bundle﹕ Key android.intent.extra.STREAM expected ArrayList but value was a android.net.Uri$HierarchicalUri. The default value <null> was returned. 
1974-1974/com.whatsapp W/Bundle﹕ Attempt to cast generated internal exception: 
java.lang.ClassCastException: android.net.Uri$HierarchicalUri cannot be cast to java.util.ArrayList 
     at android.os.Bundle.getParcelableArrayList(Bundle.java:1223) 
     at android.content.Intent.getParcelableArrayListExtra(Intent.java:4425) 
     at com.whatsapp.ContactPicker.d(ContactPicker.java:320) 
     at com.whatsapp.ContactPicker.onCreate(ContactPicker.java:306) 
     at android.app.Activity.performCreate(Activity.java:5104) 

아니면 그냥 볼 로그 :이처럼

591-963/system_process W/ActivityManager﹕ Permission denied: checkComponentPermission() 

그리고 물론

자체가 (즉, 그들은 열 수 없습니다 또는 파일을 다운로드) 오류가 나에게 토스트를 제공 애플 리케이션.

나는 인터넷 검색을 시도했는데, 많은 것을 stackoverflow 했으므로 이제 여기에 게시하고 있습니다. 내가 제대로하고있는 것 같아요, 아마도 약간의 작은 것은 잘못되었습니다 ...

어떤 도움을 주실 수 있습니다!

+0

당신이 안드로이드 XML 파일에 인터넷 권한을 넣을 수 있습니다 – Riskhan

+0

@kTekkie 질문을 이해하지 못했다고 생각합니다. – Makks129

+0

@ Makks129 JSON을 사용하여 이미지를 가져 오는 중입니다. 그렇다면 나와 샘플 코드를 공유하거나 github에서 포크를 실행할 수 있습니다. 내 요구 사항은 다음과 같습니다. GridView에서 JSON을 사용하는 유니버설 이미지 로더 + ---- 이미지에 대한 상수 링크를 사용하지 않으려 고합니다. – Sun

답변

0

이 문제는 FileProvider 인프라 또는 공유하는 응용 프로그램의 문제 일 수 있습니다.

저는이 지원을 사용하여 다른 응용 프로그램과 이미지를 공유하려고했습니다. 갤러리, 드라이브, Gmail, Keep으로 잘 작동합니다. 사진 및 Google+에서는 실패합니다.

LogCat에서 다음과 같은 항목을 볼 수 있습니다. 그러면 Uri가 한 활동에서 다른 활동으로 넘어 가고 있음을 알 수 있습니다. 그러나 인 텐트에 설정된 (임시) 권한이 손실됩니다.

11-19 21 : 14 : 06.031 : I/ActivityManager (433) : 표시 com.google.android.apps.plus/.phone.HostPhotoViewIntentActivity : + 848ms

+0

Instagram, Facebook 또는 Messenger로이 접근 방식을 시도 했습니까? 그것은 작동해야하지만 그렇게 보이지는 않습니다. –