2013-05-15 1 views
0

내가 얻으려고하는 것은 매우 익숙한 소리이며 여기 저기에 Stack Overflow에도 여러 번 게시되었지만 끝내지 못했습니다.안드로이드 응용 프로그램에서 사용자 정의 확장명을 사용하여 첨부 파일 가져 오기

시나리오는 사용자 지정 확장명이있는 첨부 파일이 포함 된 메일을받습니다. 확장 기능은 내 응용 프로그램에 의해 인식되며 처리를 위해서는 FilePath가 필요합니다. 내가 getIntent().getData()를 사용하여 내 응용 프로그램에서 첨부 파일을받을 때

현재 내가 가진 전부 내가 /sdcard/file.ext처럼 FilePath를에 유형 content://의 미디어 콘텐츠를 변환하는 방법을 보았다 content://

형태의 경로는하지만 난 할 수 없습니다 그것을 사용하여 첨부 파일을 변환하십시오. 그 명백한 수 있습니다.

content:// 유형을 실제로 다운로드하지 않고 처리 할 수있는 방법이 있습니까?

현재 k9 메일 앱에서 사용자 정의 확장 프로그램을 다운로드하면 목록에있는 내 앱이 표시되고이를 통해 열립니다. FilePath는 /sdcard/file.ext과 같아서 content:// 유형 만받을 수 있습니다.

나는이 질문을 분명히하기를 희망한다.

도와주세요.

감사합니다.

답변

0

content:// Uri이 반드시 sdcard의 파일을 가리키는 것은 아닙니다. 데이터베이스 에 저장된 모든 종류의 데이터 또는 다른 앱의 개인 파일 저장소에 대한 액세스 권한을 제공하는 콘텐츠 제공 업체를 가리킬 가능성이 큽니다.

메일 첨부 파일이있는 경우 (콘텐츠 공급자가 웹 서버에서 직접 요청하지 않은 경우)라고 생각합니다. 그러므로 content:// 경로로 변환하면 작동하지 않습니다.

은 내가

Uri uri = intent.getData(); 
if (uri.getScheme().equals("content")) { 
    String fileName = ContentProviderUtils.getAttachmentName(this, uri); 
    if (fileName.toLowerCase().endsWith(".ext")) { 
     InputStream is = this.getContentResolver().openInputStream(uri); 
     // do something 
    } else { 
     // not correct extension 
     return; 
    } 
} else if (uri.getScheme().equals("file")) { 
    String path = uri.getPath(); 
    if (path.toLowerCase().endsWith(".ext")) { 
     InputStream is = new FileInputStream(path); 
     // do something 
    } else { 
     // not correct extension 
     return; 
    } 
} 

첨부 파일 이름이

public static String getAttachmentName(Context ctxt, Uri contentUri) { 
    Cursor cursor = ctxt.getContentResolver().query(contentUri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null); 
    String res = ""; 
    if (cursor != null){ 
     cursor.moveToFirst(); 
     int nameIdx = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME); 
     res = cursor.getString(nameIdx); 
     cursor.close(); 
    } 

    return res; 
} 
+0

에 의해 발견 나는 다른 게시물에서이 방법을 사용하지만 할 수 있습니다 (이 K9 메일 앱도 작동 있는지 확실하지 않습니다) 다음 않았다 대답은 정확하고, 다른 사람들에게도 유용합니다. 따라서 올바른 것으로 표시하십시오. 그러나 위의 방법을 시도해 보면 모든 장치에서 작동하지 않는 것으로 나타났습니다. 그러므로 [DISPLAY_NAME]을 [this] (http://stackoverflow.com/questions/6035535/android-get-email-attachment-name-in-my-application)에서 제안 된 것처럼 '_display_name'으로 변경하는 것이 더 좋을 것입니다. 더 많은 기기에서 – openrijal