Android : intent.action_send with extra_stream은 HTC Hero에서 Gmail 앱을 선택할 때 이미지를 첨부하지 않습니다.

StackOverflow https://stackoverflow.com/questions/2206397

문제

기본 메일 앱이있는 에뮬레이터에서 모두 잘 작동합니다. 그러나 나는 Gmail 앱을 사용하여 영웅으로부터 보낸 우편물을받을 때 첨부 할 수 없습니다. 영웅의 기본 메일 앱은 잘 작동합니다.

이 코드가 영웅의 Gmail 앱과 어떻게 작동하도록하려면 어떻게해야합니까?
아래 코드를 볼 수 있습니다.

    private void startSendIntent() {
        Bitmap bitmap = Bitmap.createBitmap(editableImageView.getWidth(), editableImageView.getHeight(), Bitmap.Config.RGB_565);
        editableImageView.draw(new Canvas(bitmap));
        File png = getFileStreamPath(getString(R.string.file_name));
        FileOutputStream out = null;
        try {
            out = openFileOutput(getString(R.string.file_name), MODE_WORLD_READABLE);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) out.close();
            }
            catch (IOException ignore) {}
        }
        final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(png));
        emailIntent.setType("image/png");
        startActivity(Intent.createChooser(emailIntent, getString(R.string.send_intent_name)));
}

로그에서 다음을 볼 수 있습니다.

02-05 17:03:37.526: DEBUG/Gmail(11511): URI FOUND:file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg
02-05 17:03:37.535: DEBUG/Gmail(11511): ComposeActivity added to message:0 attachment:|IMAG0001.jpg|image/jpeg|0|image/jpeg|LOCAL_FILE|file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg size:0
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> Attachment uri: file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>>           type: image/jpeg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>>           name: IMAG0001.jpg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>>           size: 0

답변 주셔서 감사합니다.

도움이 되었습니까?

해결책

나에게 문제는 다음과 같은 코드 라인으로 해결되었습니다.

Bitmap screenshot = Bitmap.createBitmap(_rootView.getWidth(), _rootView.getHeight(), Bitmap.Config.RGB_565);
_rootView.draw(new Canvas(screenshot));

String path = Images.Media.insertImage(getContentResolver(), screenshot, "title", null);
Uri screenshotUri = Uri.parse(path);

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
emailIntent.setType("image/png");

startActivity(Intent.createChooser(emailIntent, "Send email using"));

핵심은 스크린 샷을 미디어 라이브러리에 저장 한 다음 거기에서 파일을 성공적으로 보낼 수 있다는 것입니다.

다른 팁

getFileStreamPath() 또는 openFileOutput() 다른 앱 (예 : Gmail)에 접근 할 수없는 개인 디렉토리에 파일을 만듭니다. 외부 스토리지를 사용하여 공개적으로 접근 가능한 파일을 만듭니다.

private static final int REQUEST_SHARE = 39714;

private File png = null;

private void startSendIntent() {
    png = new File(new File(Environment.getExternalStorageDirectory(), "Pictures"), getString(R.string.file_name));

    FileOutputStream out = null;
    try {
        out = new FileOutputStream(png);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
        out.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null) out.close();
        }
         catch (IOException ignore) {}
        }
        final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(png));
        emailIntent.setType("image/png");
        startActivityForResult(Intent.createChooser(emailIntent, getString(R.string.send_intent_name)), REQUEST_SHARE);
    }
}

USB 드라이브로 장착 될 때와 같이 외부 스토리지를 사용할 수 없을 때는 작동하지 않습니다. 참조 스토리지 API 가이드 외부 스토리지 사용 가능한지 여부를 감지하는 방법에 대한 자세한 내용.

최소 API 레벨이 8 이상인 경우 사용할 수 있습니다. Context.getExternalCacheDir() 또는 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 부모 디렉토리로.

결국 사용하지 않는 한 getExternalCacheDir(), 사용자의 파일 중 하나가 실수로 덮어 쓰는 것을 방지하기 위해 고유 한 파일 이름을 사용해야합니다.

마지막으로, 당신은 무시할 수 있습니다 onActivityResult() 공유 조작이 완료된 후 파일을 삭제하려면 다음과 같습니다.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(requestCode == REQUEST_SHARE) {
        if(this.png == null) {
            return;
        }

        this.png.delete();
    }
}

나는 같은 증상이 있었다. 제 경우에는 처음에 권한으로 첨부 파일을 저장했기 때문입니다. MODE_PRIVATE. 내가 변경하자마자 MODE_WORLD_READABLE 그런 다음 Gmail은 파일에 액세스하고 첨부 파일을 올바르게 보낼 수있는 것 같습니다. 코드 스 니펫에 보이지만 사용하고있었습니다. MODE_WORLD_READABLE ... 기이한.

http://developer.android.com/reference/android/content/context.html#mode_world_readable

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top