2011-04-23 5 views
2

내 애플 리케이션은 텍스트 파일 (SD 카드 및 내부 메모리)에 데이터를 씁니다. 나중에 응용 프로그램은 사람들의 목록에 텍스트 파일을 전자 메일로 보냅니다. gmail이 내부 애플리케이션 파일 영역에서 가져온 파일을 첨부하는 데 문제가 있습니다. '기본 Android 메일'은 문제없이 내부 또는 SD 카드 영역의 파일을 첨부 할 수 있습니다. Gmail은 파일을 SD 카드에서 가져 왔지만 내부 저장소에있는 파일은 첨부하지 않습니다. 이 SD에서 파일을 전송 //문제 내 안드로이드 애플 리케이션에서 Gmail에 내부 파일을 첨부

은 - 안드로이드 메일과 Gmail의 작동이 안드로이드 메일에 대한 내부 파일 작업을 보내지 만 더 첨부 Gmail로 전송되지 //

Intent jj=new Intent(android.content.Intent.ACTION_SEND); 

String fileName = "file://" + Environment.getExternalStorageDirectory()+"/aFolder/externalfile.txt"   

jj.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileName)); 
jj.setType("text/plain"); 

Intent chooser = Intent.createChooser(jj , "Select Sender"); 
startActivity(chooser); 

Intent jj=new Intent(android.content.Intent.ACTION_SEND); 

String fileName = "file://" + getFilesDir().toString() + "/internalfile.txt"; 

jj.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileName)); 
jj.setType("text/plain"); 

Intent chooser = Intent.createChooser(jj , "Select Sender"); 
startActivity(chooser); 

제안 사항이 있으십니까? Gmail에 특별한 권한을 부여해야합니까?
첨부 파일은 모두 앱에서 작성한 모든 텍스트 파일입니다.
내부 파일이 openFileOutput (의 myFile, 32769)

감사 존 D

+2

Gmail 인 텐트는 내부 저장소에서 파일을 첨부 (첨부 파일에 첨부)하는 것을 허용하지 않습니다. 외부 메모리 만 사용해야합니다. ( –

+0

pankaj - 그 점을 확인하는 문서를 가리킬 수 있습니까? – jday

+1

logcat에서 다음 메시지가 나타납니다 : ERROR/Gmail (9147) : file : // 첨부 파일 경로가 파일을 가리켜 야합니다 : /// mnt/sdcard. 첨부 파일 무시 : ///data/data/my.package.name/files/myfile.txt 어떻게 해석해야합니까? - 내부 메모리 파일을 GMail에 절대로 부착 할 수 없습니까? - 사용 권한을 변경해야합니까? - URI를 다른 방식으로 구성해야합니까? – jday

답변

2

와 나는이 문제를 볼 수있는 유일한 방법을 만든 내 자신의 콘텐츠 제공을하고 같은 내 콘텐츠 제공 업체에 URI를 전달했다 부착.

0

실제로는 an issue with gmail 인 것으로 보입니다. 불행히도, 그러나 서면의 시점에서 그것은 고정되지 않은 것으로 보인다.

1

Dhego와 마찬가지로 콘텐츠 제공 업체를 사용했습니다. 특히, FileProvider.

https://developer.android.com/reference/android/support/v4/content/FileProvider.html

이것은 단지 당신이 당신의 매니페스트를 수정하고 추가 리소스 파일을 만들어야합니다 사용하기. 또한 FileProvider에서 제공하는 정적 메서드를 통해 유효한 형식의 URI를 가져와야합니다. 당신의 Manfiest에서

:

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

은 "com.example.authority.fileprovider는"추가 "fileprovider"사용하여 응용 프로그램의 권한이다.

res/xml 폴더에서 노출시키려는 파일의 경로가 들어있는 file_paths.xml 파일을 만듭니다. 내 경우

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

, 내가 파일을 작성하고있는 응용 프로그램 캐시 디렉토리에있는 폴더는 "보고서"내 XML의 모습 때문에 내 경우에는, 나는, 응용 프로그램 캐시 디렉토리에서 그들을 노출했다. 당신이 file_paths.xml에 지정된 폴더와 저장 영역에 노출 할

  1. 쓰기 파일 :

    할 수있는 마지막 일은 코드입니다.

  2. 전자 메일 보내기 (Intent.ACTION_SEND)를 호출 할 인 텐트에 설정할 유효한 URI를 생성합니다.당신의 의도에

    emailIntent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getActivity(), "com.example.authority.fileprovider", fileToAttach)); 
    

    호출 startActivity를하고 그게 있어야한다 :

는 여기에 몇 가지 예제 코드입니다!

+0

고마워, 제대로 작동합니다. – BArtWell

관련 문제