7

最初は「待って、この質問は重複している!」と思うでしょう。読む。

メールアプリだけACTION_SENDTOが応答するようにするために、(データとしてメール URI を使用して)インテントを使用しようとしています。

(を使用ACTION_SENDすると、データ URI のない標準の「SEND」セレクターが起動します。これは、Google ドライブなどの非メール アプリも応答することを意味します)。

私の問題は、添付ファイルACTION_SENDがすべてのデバイスで機能することですが、ACTION_SENDTO一部のデバイスのみを使用すると、ファイルが正しく添付されます。Nexus 7 は動作しますが、Samsung Galaxy Tab と Acer Iconiaは動作しません

以下に、さまざまな方法を並べて示します。

    String email    = getActivity().getResources().getString(R.string.supportEmail);
    String subject  = getActivity().getResources().getString(R.string.sFeedback);
    subject         = String.format(subject, 
                      getActivity().getResources().getString(R.string.productName));
    String content  = getActivity().getResources().getString(R.string.whatFeedbackWouldYouLikeToProvide) + "\n\n" + 
                      mMessage.getText().toString();
    File toSend     = new File(outfile);

    if(toSend.exists()) {
        Log.e("Feedback", "File path: " + toSend.getAbsolutePath());

        Intent emailIntent = new Intent(android.content.Intent.ACTION_SENDTO);
        emailIntent.setData(Uri.parse("mailto:" +email));
        emailIntent.putExtra(android.content.Intent.EXTRA_STREAM,   Uri.fromFile(toSend));
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,  subject);               
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,     content);  

    /*  Intent emailIntent = new Intent(Intent.ACTION_SEND);
        emailIntent.setType("message/rfc822");
        emailIntent.putExtra(Intent.EXTRA_EMAIL  , new String[]{email});
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
        emailIntent.putExtra(Intent.EXTRA_TEXT   , content);
        emailIntent.putExtra(Intent.EXTRA_STREAM , Uri.fromFile(toSend)); */

        try {
            startActivity(emailIntent);
        } catch (ActivityNotFoundException anfe) {
            Toast.makeText(getActivity(), getResources().getString(R.string.pleaseInstallAnEmailClientInOrderToSendUsFeedback), 8000).show();
        }
    }

ファイルパスが問題ではないように見えることがわかります。レポートするログに追加しました。

サムスンが提供するもの:

04-11 11:40:09.953: E/Feedback(6286): File path: /storage/sdcard0/logs.zip

ネクサスが与えるもの:

04-11 11:38:59.249: E/Feedback(12702): File path: /storage/emulated/0/logs.zip

getExternalStorageDirectory()(両方ともアプリケーション間のアクセスを確保することに基づいています)。

違いの理由を知っている人はいますか?

4

6 に答える 6

2

私は同様の問題に遭遇し、中国のブログで潜在的な答えを見つけるまで、一日中頭を悩ませていました: http://flysnow.iteye.com/blog/1128354

記事の終わり近くまで、Android の組み込みメール クライアントが持つインテント フィルターについて説明しています。

<activity
    android:name=".activity.MessageCompose"
    android:label="@string/app_name"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <action android:name="android.intent.action.SENDTO" />
        <data android:scheme="mailto" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
    <intent-filter android:label="@string/app_name">
        <action android:name="android.intent.action.SEND" />
        <data android:mimeType="text/plain" />
        <data android:mimeType="image/*" />
        <data android:mimeType="video/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

SEND インテントと SENDTO インテントを異なる方法で処理する 2 つのインテント フィルターがあり、SEND のみが mimeType で指定されていることがわかります。コード スニペットは Android 1.6 にさかのぼりますが、あまり変更されていません。あなたは最近のバージョンでそれを見つけることができます:

https://android.googlesource.com/platform/packages/apps/Email/+/f44b729bff619d0a9f0b1492726351e41c1e5d5d/AndroidManifest.xml

SENDTOインテントでmimeTypeを指定しない理由はわかりませんが、それがその通りです。ほとんどのメールクライアントはおそらく同じようにしていると思います(Gmailを除いて、SENDTOインテントを使用するとファイルを正常に添付できます)。それはあなたの場合でもありますか?したがって、安全のために、SEND インテントを使用してのみ添付ファイルを送信する必要があります。

于 2014-12-02T09:33:30.233 に答える
0

件名と本文を Uri に入れてみてください。 この質問は、問題を解決する可能性があることを暗示しているようです。

于 2013-04-11T11:16:03.327 に答える
0

受信者が指定されていても、さまざまなIntent.ACTION_SEND電子メールクライアントによって正しく処理されます(これは正しくありませんが..)。そのため、Gmail 以外のクライアントをサポートしたい場合は、このアクションを使用する必要があります。それがまさにその仕組みです。

受信者を追加するには、 を使用している場合に追加するのとまったく同じ行を追加しますIntent.ACTION_SENDTO

Intent emailIntent = new Intent(Intent.ACTION_SEND);
String mailto = "abc@def.com";
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{mailTo});
...

私の場合、Gmail以外のクライアントで添付ファイルが追加されずIntent.ACTION_SENDTO、切り替えてIntent.ACTION_SEND解決しました。

于 2016-03-21T14:08:01.167 に答える