1

내 앱에서 사용자는 파일을 선택하고 적절한 앱에서 열 수 있습니다 (ACTION_VIEW 인 텐트 사용). 데이터를 다른 앱에 보내기 전에 데이터에 대한 작업을해야합니다. 따라서 스트리밍 솔루션을 사용하고 있습니다. openTypedAssetFilewriteDataToPipe을 구현하는 ContentProvider를 구현했습니다 (이 메서드는 openPipeHelper로 생성 된 출력 ParcelFileDescriptor를 채 웁니다.).Android 갤러리에서 스트리밍 된 파일을 지원하지 않습니다

작동 방식 : .pdf 파일, .txt 파일 등을 열 수 있습니다. 스트리밍이 올바른 것처럼 보입니다. 3 자 앱을 사용하여 이미지를 열 수 있습니다. 나는 Gallery를 사용하여 이미지를 열 때 그러나, (갤러리 검은 화면을 보여줍니다) 작동하지 않습니다, 나는 다음과 같은 예외가 얻을 :

fail to open myfile.jpg 
UriImage(21890): java.io.FileNotFoundException: Not a whole file 

나는 갤러리 원 (here)에서보고했다 및 나는 예외가 여기에서 발생되는 것을 볼 수 있습니다 : 내가 선택한 경우

 try { 
      if (MIME_TYPE_JPEG.equalsIgnoreCase(mContentType)) { 
       InputStream is = mApplication.getContentResolver() 
         .openInputStream(mUri); 
       mRotation = Exif.getOrientation(is); 
       Utils.closeSilently(is); 
      } 
      **mFileDescriptor = mApplication.getContentResolver() 
        .openFileDescriptor(mUri, "r");** 
      if (jc.isCancelled()) return STATE_INIT; 
      return STATE_DOWNLOADED; 
     } catch (FileNotFoundException e) { 
      Log.w(TAG, "fail to open: " + mUri, e); 
      return STATE_ERROR; 
     } 

그러나, 한 번 갤러리 응용 프로그램에서 "바탕 화면으로 설정"을 선택한 후 내 이미지를 볼 수 있습니다, 그 다음 잘 스트리밍입니다. 갤러리가 열리면 문제가 발생합니다.

(ContentResolver 코드 등에서) 더 자세히 살펴본 후 나는 왜 이런 식으로 행동하는지 이해할 수 없었습니다. Gallery은 스트리밍 파일을 지원하지 않는 것 같습니다. 그게 맞습니까? 의견이 있으십니까?

고마워요./:

+0

그런 다음 자신의 갤러리를 만들 선택한 이미지에 액세스, HTTPS 나를 위해 일이다 /github.com/luminousman/MultipleImagePick – Rohit

답변

-1
  String scheme = mUri.getScheme(); 

      ContentResolver contentResolver = getContentResolver(); 

      // If we are sent file://something or 
      // content://org.openintents.filemanager/mimetype/something... 
      if (scheme.equals("file") 
        || (scheme.equals("content") && fileUri 
          .getEncodedAuthority().equals(
            "org.openintents.filemanager"))) { 

       // Get the path 
       filePath = fileUri.getPath(); 

       // Trim the path if necessary 
       // openintents filemanager returns 
       // content://org.openintents.filemanager/mimetype//mnt/sdcard/xxxx.jpg 
       if (filePath.startsWith("/mimetype/")) { 
        String trimmedFilePath = filePath 
          .substring("/mimetype/".length()); 
        filePath = trimmedFilePath.substring(trimmedFilePath 
          .indexOf("/")); 
       } 
       } else if (scheme.equals("content")) { 

       // If we are given another content:// URI, look it up in the 
       // media provider 

       filePath = getFilePathFromContentUri(fileUri, 
         contentResolver); 

      } else { 

       Log.e("filePath--------->>>>>", filePath + ""); 
      } 

지금

private String getFilePathFromContentUri(Uri selectedVideoUri, 
     ContentResolver contentResolver) { 
    String filePathString; 
    String[] filePathColumn = { MediaColumns.DATA }; 

    Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, 
      null, null, null); 
    cursor.moveToFirst(); 

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
    filePathString = cursor.getString(columnIndex); 
    cursor.close(); 
    return filePathString; 
    } 

이 파일 경로를 사용

는 ..

try { 
     if (MIME_TYPE_JPEG.equalsIgnoreCase(mContentType)) { 
      InputStream is = mApplication.getContentResolver() 
        .openInputStream(filePath); // ** change is here 
      mRotation = Exif.getOrientation(is); 
      Utils.closeSilently(is); 
     } 
     ** mFileDescriptor = mApplication.getContentResolver() 
       .openFileDescriptor(filePath, "r"); ** 
     if (jc.isCancelled()) return STATE_INIT; 
     return STATE_DOWNLOADED; 
    } catch (FileNotFoundException e) { 
     Log.w(TAG, "fail to open: " + mUri, e); 
     return STATE_ERROR; 
    } 

+0

죄송하지만 귀하의 코드는 원래 질문에 전혀 답변하지 않습니다. . 원래 질문은 스트림하는 ContentProvider를 통해 파일을 여는 앱에서 다른 스트림으로 데이터를 스트리밍하는 것입니다. – Vincent

+0

그리고 지금이 파일 경로를 사용하십시오 .. 이것은 저에게 효과적입니다. –

관련 문제