2016-09-22 10 views
0

android.intent.action.GET_CONTENT 의도로 회신하여 사진을 보내는 앱을 만들려고합니다. 내 유스 케이스는 가장 일반적인 SMS/MMS 앱 인 Play 스토어의 메신저 앱입니다.android.intent.action.GET_CONTENT에 대한 이미지 보내기

사진을 보내려고했으나 제대로 작동하지 않았습니다. 안드로이드 폰으로 MMS를 보낼 때, 그들은 적절하게 그것을 얻지 만, 그러나 아이폰은 그것을 재생하지 못하는 가짜 비디오로 표시합니다.
내 또는 외국 사업자 인 MMSC 서버가 원인이 될 수 있음을 알고 있습니다. 이는 현명한 생각으로 데이터를 예상했던대로 트랜스 코드하여 좋은 형식입니다.

그러나 다른 앱 (Google 포토 앱과 솔리드 탐색기 사용)에 동일한 의도를 사용하면 Android와 iPhone에서 모두 잘 작동합니다.

내 생각에 사진 및 단색 탐험가는 MMS 앱이 MMSC로 적절히 전송하여 사진을 그대로 전송하는 올바른 형식으로 데이터를 전송합니다. 여기

내가 시도 무엇 다음을 설정하여, CommonWare's CWAC lib를 사용하여 StreamProvider를 사용하여 내 파일의 Uri 보내기
  • 작동하지 :

    1. Content#getExternalCacheDir()을 통해 (캐시에 내 파일의 간단한 Uri 보내기 LocalPathStrategyContext#getExternalCacheDir()을 루트 경로로 사용 : 작동하지 않음

    두 전략 모두 이미지가 MMS 앱이 제대로 표시되며 버튼이 표시되면 'MMS 보내기'가됩니다. 안드로이드에서는 사진으로 수신되고 iOS에서는 작동하지 않는 가짜 비디오입니다.

    데이터를 호출 앱으로 다시 보내려면 어떻게해야합니까?

    그냥 실제로 내가 무슨 짓을했는지 설명하기 위해, 여기에 첫 번째 전략 :

    Intent result = new Intent(); 
    result.setData(Uri.fromFile(localImage)); 
    setResult(Activity.RESULT_OK, result); 
    finish(); 
    

    여기에 두 번째입니다 :

    Intent result = new Intent(); 
    result.setData(PROVIDER 
         .buildUpon() 
         .appendPath(StreamProvider.getUriPrefix(AUTHORITY)) 
         .appendPath(localImage.getName()) 
         .build()); 
    result.setFlags(FLAG_GRANT_READ_URI_PERMISSION); 
    setResult(Activity.RESULT_OK, result); 
    finish(); 
    

    내가 의도에서 데이터로 비트 맵 바이트를 전달할 수 있다고 생각, 그러나 나는 이것을 할 길을 찾지 못했습니다. 당신이 결과 Uri에 대한 ContentProvider를 사용하는 경우 setResult() 또한, FLAG_GRANT_READ_URI_PERMISSION 및/또는 FLAG_GRANT_WRITE_URI_PERMISSIONIntent을 필요로 같은

  • +1

    을 MMS가 아닌 다른 것으로 테스트하고 접근법간에 차이점을 확인하십시오. 예를 들어 이메일 첨부 파일로 보냅니다. 또는,'ACTION_GET_CONTENT' 클라이언트를 만들고, 다양한 시나리오를 테스트하고, 돌아 오는 것을 비교해보십시오. 또한 도움이 필요한 경우 MIME 유형을 응답'Intent '에 첨부하는 것을 고려할 수도 있습니다. – CommonsWare

    +0

    나는 클라이언트 루트와 함께 갈 것이다. 그것은 굉장하다. 나는 그것에 대해 생각해 봤어야 했어! 감사. –

    +0

    내 의도와 솔리드 탐색기의 유일한 차이점은 플래그가 1 ('FLAG_GRANT_READ_URI_PERMISSION')로 설정되어 있으며 MIME 유형이 정의되어 있다는 것입니다. 나는 그들의 공급자가 깃발을 위해 당신과 같은 수준의 보안을 가지고 있지 않다고 추측하고 있습니다. 내가 MIME 형식을 adedd, 여전히 실패합니다. Google 포토에는 플래그 = 1과 추가 클립 데이터가 있습니다.이 클립 데이터는 콘텐츠와 동일한 URI를 포함하는 하나의 항목의 '텍스트/URI 목록'입니다. 따라서 내 결과의 의도는 Solid Explorer와 Google 포토의 결과와 거의 동일하므로 제공자 측에 있다고 추측합니다. 거기에 설정할 MIME 형식이 있습니까? –

    답변

    1

    예, 그것은 보인다.

    addFlags()

    내가이 이전의 테스트되지 않은 API 레벨 19에 적어도 다시는 Intent에 이러한 플래그를 추가하기 위해 노력하고, 그래서 당신이 ClipData 트릭을 사용해야 할 경우 버전이있을 수 있습니다 :

    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) { 
        i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    } 
    else if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN) { 
        ClipData clip= 
        ClipData.newUri(getContentResolver(), "A photo", outputUri); 
    
        i.setClipData(clip); 
        i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    } 
    else { 
        List<ResolveInfo> resInfoList= 
        getPackageManager() 
         .queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY); 
    
        for (ResolveInfo resolveInfo : resInfoList) { 
        String packageName = resolveInfo.activityInfo.packageName; 
        grantUriPermission(packageName, outputUri, 
         Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
        } 
    }