0

電話の連絡先をファイルに書き込んで、Eメールインテントアクションを介してエクスポートしています。SDカードにファイルを書き込むとエクスポートは正常に動作しますが、エミュレータの電話メモリにファイルを書き込むと、添付ファイルなしでメールが届きます。マイログに「アンロードされた添付ファイルはダウンロード用にマークされていません」と表示されます。

以下は私のコードです

        file = new File(ctx.getFilesDir().getAbsolutePath(),"file.txt");

        if (file.exists()) {
            file.delete();

        }
        writer = new BufferedWriter(new FileWriter(file));
        for (int i = 0; i < names.size(); i++) {
            writer.write(names.get(i) + "," + phnno.get(i) + "\r\n");
        }

        writer.flush();
        writer.close();

これは私のメールインテントです

                                Uri u1 = null;
                                u1 = Uri.fromFile(file);
                                System.out.println("u1 of URI"+u1); //u1 in logcat is "file:///data/data/com.android.contactxport/files/file.txt"


                                Intent sendIntent = new Intent(
                                        Intent.ACTION_SEND);
                                sendIntent.putExtra(Intent.EXTRA_SUBJECT,
                                        "Mail from ContactXPort App");
                                sendIntent
                                        .putExtra(Intent.EXTRA_STREAM, u1);
                                sendIntent.setType("text/html");
                                startActivity(sendIntent);

編集:アンロードされた添付ファイルについての文書は言う

/**
 * Check whether the message with a given id has unloaded attachments.  If the message is
 * a forwarded message, we look instead at the messages's source for the attachments.  If the
 * message or forward source can't be found, we return false
 * @param context the caller's context
 * @param messageId the id of the message
 * @return whether or not the message has unloaded attachments
 */
public static boolean hasUnloadedAttachments(Context context, long messageId) {
    Message msg = Message.restoreMessageWithId(context, messageId);
    if (msg == null) return false;
    Attachment[] atts = Attachment.restoreAttachmentsWithMessageId(context, messageId);
    for (Attachment att: atts) {
        if (!attachmentExists(context, att)) {
            // If the attachment doesn't exist and isn't marked for download, we're in trouble
            // since the outbound message will be stuck indefinitely in the Outbox.  Instead,
            // we'll just delete the attachment and continue; this is far better than the
            // alternative.  In theory, this situation shouldn't be possible.
            if ((att.mFlags & (Attachment.FLAG_DOWNLOAD_FORWARD |
                    Attachment.FLAG_DOWNLOAD_USER_REQUEST)) == 0) {
                Log.d(Logging.LOG_TAG, "Unloaded attachment isn't marked for download: " +
                        att.mFileName + ", #" + att.mId);
                Attachment.delete(context, Attachment.CONTENT_URI, att.mId);
            } else if (att.mContentUri != null) {
                // In this case, the attachment file is gone from the cache; let's clear the
                // contentUri; this should be a very unusual case
                ContentValues cv = new ContentValues();
                cv.putNull(AttachmentColumns.CONTENT_URI);
                Attachment.update(context, Attachment.CONTENT_URI, att.mId, cv);
            }
            return true;
        }
    }
    return false;
}

私が理解しているのは、パスがここでの問題ですが、ログに出力したときのパスはfynです。

どんな助けでも大歓迎です。前もって感謝します。

4

3 に答える 3

0

私の最近の経験から、外部ファイルUri(getExternalCacheDir()、getExternalFilesDir()、Environment.getExternalStorageDirectory())でIntent.EXTRA_STREAMを使用すると、多数の電子メールクライアントアプリで効果的に機能します(おそらく:私だけテスト済みのGMail、Evernote、およびネイティブの電子メールクライアント)...ただし、特に:ネイティブの電子メールアプリを介して除外されます...

昨日行ったテストでは、MS Exchangeの企業の電子メールアカウントに対してネイティブの電子メールアプリを使用しましたが、「アンロードされた添付ファイルはダウンロード用にマークされていません:」デバッグメッセージが表示されました。電子メールメッセージは、最初は添付ファイル付きで(添付ファイルのサイズが表示されていても)正しく作成されているように見えましたが、電子メールは添付ファイルなしで送信されました。

Gmailクライアントを使用したそのような動作はありません:すべてが正常です。送信する前にGMailで添付ファイルのサイズを確認したいのですが、ファイルはメールメッセージと一緒に送信されます。その一方で、Evernoteは、添付ファイルを埋め込みオブジェクトとして編集可能なメモを作成します。

あなたが投稿した参照ソースコードを見ると、AndroidネイティブのEメールアプリ開発者は添付ファイルについて少し間違った仮定をしていると思います。Intent.EXTRA_STREAMからの添付ファイルを提供しなかっただけです...添付ファイルは送信前にメッセージとともに表示されるため、ネイティブのメールアプリデータベースでのメール作成時、または添付ファイルで保存されない可能性があります。プロセスで誤ってフラグが立てられている/フラグが立てられていない。

これはそれ自体では質問に答えないことは知っていますが、ネイティブの電子メールアプリを介して添付ファイルを送信することに関しては(Android ICSでわかることはたくさんあります)、私たちは立ち往生していると思います!

于 2012-07-20T15:27:15.677 に答える
0

これは、ドキュメントが内部ストレージについて述べていることです。

デフォルトでは、内部ストレージに保存されたファイルはアプリケーション専用であり、他のアプリケーションはそれらにアクセスできません(ユーザーもアクセスできません)。

だから私は今私のアプリケーションでファイルを添付するネイティブのAndroidメールアプリ機能を使用しようとしています。

または、他のバックエンド開発手法を使用して、エクスポートするコンテンツを含むファイルを添付できます。

于 2012-07-20T06:28:08.343 に答える
0

Intent.setTypeネイティブメールアプリが添付ファイルを受け入れるには、ではなくを使用するだけでなく、呼び出す必要があることがわかりましACTION_SENDACTION_SENDTO

メールの添付ファイルをGmailアプリとネイティブアプリの両方で機能させるという最終的な意図をどのように構築したかを次に示します。

Intent intent  = new Intent(Intent.ACTION_SEND); // SENDTO does not work for native email app
        intent.setData(Uri.fromParts("mailto",to, null));
        intent.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
        intent.putExtra(Intent.EXTRA_SUBJECT, subject);
        intent.putExtra(Intent.EXTRA_TEXT, body);
        intent.setType("message/email");
        if (attachmentInCacheDir != null) {
            intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + getAuthority(context) + "/" + attachmentInCacheDir.getName()));
        }
        context.startActivityForResult(Intent.createChooser(intent, "Send Email"), 1000);

ご覧のとおり、ファイルを外部ストレージにコピーしないように、ファイルアクセスにコンテンツプロバイダーも使用しています。ネイティブアプリがプロバイダーで「query」を呼び出してファイルサイズを要求するため、これはまったく新しいワームの缶でした。サイズがゼロの場合、アタッチされません。Gmailははるかに寛大です。

于 2015-03-11T23:59:05.683 に答える