ProgramingTip

SD 카드의 파일을 이메일에 첨부합니다.

bestdevel 2020. 11. 4. 08:11
반응형

SD 카드의 파일을 이메일에 첨부합니다.


이메일을 보내기 위해 의도를 시작합니다. 모두 작동하지만 실제로 이메일을 보내려고하면 '이상한'일이 발생합니다.

여기에 코드가 있습니다.

Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("image/jpeg");
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Photo");
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://sdcard/dcim/Camera/filename.jpg"));
sendIntent.putExtra(Intent.EXTRA_TEXT, "Enjoy the photo");
startActivity(Intent.createChooser(sendIntent, "Email:"));

Gmail은 Gmail 메뉴를 사용하여 시작하면 첨부 파일이 표시되고 이메일에 입력하고 본문과 제목을 편집 할 수 있습니다. 별거 아니야. 나는 보내기를 눌렀다가 보냅니다. 유일한 것은 첨부 파일이 전송되지 않는다는 것입니다.

그래서. 이메일 메뉴에서 시도해 보는 것이 어떻겠습니까? (전화의 백업 이메일 계정) 첨부 파일은 표시되지 않습니다. 보낼 때 첨부 파일이 전송됩니다. 그것은 내가 뭔가 아주 잘못 믿게 만들 것입니다. 매니페스트에서 첨부 파일이있는 이메일을 보내려면 새로운 권한이 필요합니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?


또한 같은 문제가 발생합니다.

암호 :

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
    emailIntent.setType("image/jpeg");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] 
    {"me@gmail.com"}); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
    "Test Subject"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, 
    "go on read the emails"); 
    Log.v(getClass().getSimpleName(), "sPhotoUri=" + Uri.parse("file:/"+ sPhotoFileName));
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/"+ sPhotoFileName));
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));

adb logcat에서 :

V/DumbDumpersMain( 3972):   sPhotoUri=file://sdcard/DumbDumpers/DumbDumper.jpg
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.CHOOSER comp={android/com.android.internal.app.ChooserActivity} (has extras) }
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x3000000 comp={com.google.android.gm/com.google.android.gm.ComposeActivityGmail} (has extras) }
I/ActivityManager(   56):   Starting activity: Intent { action=android.intent.action.SEND type=jpeg/image flags=0x2800000 comp={com.google.android.gm/com.google.android.gm.ComposeActivity} (has extras) }
D/gmail-ls(  120):      MailProvider.query: content://gmail-ls/labels/me@gmail.com(null, null)
D/Gmail   ( 2507):      URI FOUND:file://sdcard/DumbDumpers/DumbDumper.jpg

이메일 제공 업체가 길이가 0 인 파일을 첨부하는 것입니다. 파일 시스템을 확인하면 파일이 수정됩니다. 이미지 파일을 전에 만드는 코드는 이메일을 보내기 전에 잘 완성되었습니다.

누구든지 매직 없이이 문제를 해결 했습니까? (이미 시도했습니다)?

감사합니다,
Fin

최신 정보

나를위한 길은

file:///sdcard/DumbDumpers/DumbDumper.jpg

/루트 디렉토리를 이것이 가리 키기 때문에 여분 필요합니다 .

file:// + /sdcard/DumbDumpers/DumbDumper.jpg

다음과 같이 결합

file:///sdcard/DumbDumpers/DumbDumper.jpg

위의 스 니펫에는 다음이 필요합니다.

emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+ sPhotoFileName));

이게 도움이 되길 계속. 평범한 데 시간이 많이 걸렸습니다.

감사합니다,
Finlay


내 쪽에서 약간의 발언. GMail에서 동일한 문제가 발생했지만 문제의 파일을 먼저 SD 카드에 저장하고 자산이 아닌 거기에서 검색하면 작동하는 것입니다. 그래서 내 코드는 다음과 가변적입니다.

Intent i = new Intent(Intent.ACTION_SEND);
i.putExtra(Intent.EXTRA_SUBJECT, "Title");
i.putExtra(Intent.EXTRA_TEXT, "Content");
i.putExtra(Intent.EXTRA_STREAM, uri);
i.setType("text/plain");
startActivity(Intent.createChooser(i, "Send mail"));

그리고 여기,

uri = Uri.fromFile(new File(context.getFilesDir(), FILENAME));

작동하지 않는 반면

uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), FILENAME));

그렇습니다.

감사합니다, Michael


"Uri.parse"대신 "Uri.fromFile (new File (Environment.getExternalStorageDirectory (),"file name "))"사용

Environment.getExternalStorageDirectory ()-SD 카드 또는 기타 외부 저장소 경로


이것이 실제로 올바른 것으로 보이며 무슨 일이 일어 났는지 확실하지 않지만 재부팅 후 작동하기 시작했습니다.


    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("message/rfc822");
    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"example@mail.com"});
    i.putExtra(Intent.EXTRA_SUBJECT, "Data from app");
    i.putExtra(Intent.EXTRA_TEXT   , "experience number x");
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "filename.txt"));
    i.putExtra(Intent.EXTRA_STREAM, uri);
    startActivity(Intent.createChooser(i, "Send email..."));

나는 같은 문제가 있었고 모든 곳에서 해결책을 찾았습니다. 마지막으로 나는 즉시 작동하는 오픈 소스 앱을 찾아서 해결 방법을 살펴 보았습니다. 코드가 길기 때문에 여기에 인용하지 않고 링크를 게시하겠습니다. 449 행의 sendEmail 함수를보십시오.

http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/trunk/src/urbanstew/RehearsalAssistant/SessionPlayback.java?revision=94&view=markup

내 코드를 비슷하게 리팩토링했는데 이제 작동합니다. 나는 이것이 같은 상황에있는 다른 사람들에게 도움이되기를 바랍니다.


에서 RFC 1738 섹션 3.10 :

파일 URL은 다음과 같은 형식을 취합니다.

   file://<host>/<path>

여기서 host 는 경로에 액세스 할 수있는 시스템의 정규화 된 도메인 이름이고 pathdirectory / directory /.../ name 형식의 계층 적 디렉토리 경로입니다 .

두 번째와 세 번째 슬래시 사이에 암시 적 'localhost'가 있기 때문에 http : // host / path / from / root 와 마찬가지로 file : /// path / from / root 입니다. 그러나 위에서 언급했듯이 Uri.FromFile ()을 사용하여 빌드하십시오.


저도 같은 증상을 보였습니다. 제 경우에는 처음에 권한과 함께 첨부 파일을 저장했기 때문 MODE_PRIVATE입니다. 내가 그것을 변경하자마자 MODE_WORLD_READABLEGmail이 파일에 액세스하여 첨부 파일을 제대로 보낼 수 있었던 것 같습니다.

더보기


그것은 나를 위해 완벽하게 작동합니다.이 솔루션에서 Nicolas는 Cache 폴더 안에 하나의 사본을 만들고 여기에 Gmail 의도가 액세스 할 수 있습니다! http://stephendnicholas.com/archives/974


public void sendMail(String path) {
        Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
        new String[] {AppConstant.server_mail});
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
        "IBPS ERROR Mail");
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,
        "This is an autogenerated mail from IBPS app");
        emailIntent.setType("image/png");
        Uri myUri = Uri.parse("file://" + path);
        emailIntent.putExtra(Intent.EXTRA_STREAM, myUri);
        startActivity(Intent.createChooser(emailIntent, "Send mail..."));
        }

또한 Intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION); 이것은 내 문제에 도움이되었습니다.


4 일 후에 해결책을 찾았습니다. Android (Java)에서 File 클래스에 대한 경로를 제공하는 동안 다음 사항에 유의하십시오.

1) 내부 저장 경로 사용 String path = "/ storage / sdcard0 / myfile.txt";

2) path = "/ storage / sdcard1 / myfile.txt";

3) 매니페스트 파일에서 권한을 언급합니다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

4) 먼저 파일 길이를 확인하여 확인하십시오.

5) sdcard0 및 sdcard1에 관한 ES 파일 탐색기의 경로가 같거나 다른지 확인하십시오.

예 :

File file=new File(path); 
long=file.length();//in Bytes

첨부 파일이있는 이메일 보내기 : (문서로)

Intent emailIntent = new Intent (Intent.ACTION_SEND); emailIntent.setType (HTTP.PLAIN_TEXT_TYPE);

emailIntent.putExtra (Intent.EXTRA_EMAIL, new String [] { "jon@example.com"});

emailIntent.putExtra (Intent.EXTRA_SUBJECT, "이메일 제목"); emailIntent.putExtra (Intent.EXTRA_TEXT, "이메일 메시지 텍스트"); emailIntent.putExtra (Intent.EXTRA_STREAM, Uri.parse ( "content : // path / to / email / attachment"));

// Uris의 ArrayList를 전달하여 여러 항목을 첨부 할 수도 있습니다.

참고 URL : https://stackoverflow.com/questions/587917/trying-to-attach-a-file-from-sd-card-to-email

반응형