Android開發(fā)--調(diào)用系統(tǒng)郵件

題前語

????Android系統(tǒng)的開源性使其在當前智能手機市場占據(jù)絕對優(yōu)勢,同時也產(chǎn)生了各種各樣的機型和系統(tǒng)。這使得我們Android開發(fā)人員需要根據(jù)不同的機型和系統(tǒng)去做對應的適配。

正文

????本篇所述需求為調(diào)用本地郵件客戶端發(fā)送帶有附件的郵件。

第一種常規(guī)調(diào)用郵件

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL, "");
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
startActivity(Intent.createChooser(intent, "分享一下"));

????加載效果如下:

ACTION_SEND.png

????我們看到第一種情況,我們標識的郵件(mailto),但是實際執(zhí)行卻成了分享文件,雖然其中也有郵件客戶端,但是卻增加了用戶的操作步驟,這樣的情況是產(chǎn)品經(jīng)理不可接受的,所以我們嘗試第二種方法。

第二種使用SENDTO來試試(網(wǎng)上多提倡此種方式)

  Intent intent = new Intent(Intent.ACTION_SENDTO);
  intent.setData(Uri.parse("mailto:"));
  intent.putExtra(Intent.EXTRA_EMAIL, "");
  intent.setType("text/plain");
  intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
  startActivity(Intent.createChooser(intent, "分享一下"));

SENDTO代碼加載如下:

ACTION_SENDTO.png

????SENDTO確實能調(diào)用郵箱客戶端,但是上面的截圖是“沒有應用可執(zhí)行此操作”。為什么說確實能調(diào)用呢,因為在有的機型上確實可以調(diào)用,但是華為平板卻沒有調(diào)起來。我們是不是就可以推測華為把Android系統(tǒng)郵箱相關(guān)標識改了呢?有興趣的同學可以去看看華為系統(tǒng)的源碼。既然這樣的方式不行,那么我們就繼續(xù)探索還有沒有其他的方法。

第三種方式SEND_MULTIPLE多附件發(fā)送

SENDTO是發(fā)送單個附件,而SEND_MULTIPLE卻是攜帶多個附件進行發(fā)送,下面我們來試試這一段代碼執(zhí)行的情況

Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL, "");
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_STREAM, list);//Uri.fromFile(file)
startActivity(Intent.createChooser(intent, "分享一下"));

多附件執(zhí)行截圖如下:

ACTION_SEND_MULTIPLE.png

????我們看到這個多附件的發(fā)送同第一種情況類似,調(diào)起了系統(tǒng)的所有郵件客戶端和藍牙,不過我們不需要調(diào)用這么多應用,那么我們就再試試其他的方式。

第四種直接調(diào)用應用

????相信肯定有直接能夠調(diào)用某個工具軟件的方式,我們直接用這種方式會不會能夠達到我們想要的效果呢?我們一起來試試

 Intent intent = new Intent(android.content.Intent.ACTION_SEND);
 intent.putExtra(Intent.EXTRA_EMAIL, "");
 intent.setType("text/plain");
 intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
 intent.setClassName("com.android.email","com.android.email.activity.MessageCompose");
 startActivity(Intent.createChooser(intent, "分享一下"));

????直接調(diào)用執(zhí)行效果截圖:

最終效果圖.png

????這樣看我們是不是找?guī)讉€不同型號不同系統(tǒng)的手機,獲取對應的包名和Activity就可以達到我們想要的效果呢?答案是肯定的。并且經(jīng)過試用小米、紅米、三星、華為、榮耀、努比亞,發(fā)現(xiàn)可以實現(xiàn)需求。因為手上沒有魅族的機器所以還沒有在魅族的系統(tǒng)上嘗試過,有條件的同學可以試試,順便告知一下。我將萬分感謝。

最終代碼

????奉上最終代碼,因為一個類就可以解決了,就不在放Github了。

package com.hewc.sendmail;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.StrictMode;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.io.File;

public class MainActivity extends AppCompatActivity {

private Context context;
private String filePath = "/storage/emulated/0/20.txt";

private static final String[] NARMAL_PHONE = {"com.android.email", "com.android.email.activity.MessageCompose"};
private static final String[] MIUI_PHONE = {"com.android.email", "com.kingsoft.mail.compose.ComposeActivity"};
private static final String[] SAMSUNG_PHONE = {"com.samsung.android.email.provider", "com.samsung.android.email.composer.activity.MessageCompose"};


@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = this;
    setContentView(R.layout.activity_main);
    // android 7.0系統(tǒng)解決拍照的問題
    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
    StrictMode.setVmPolicy(builder.build());
    builder.detectFileUriExposure();

    TextView tv = findViewById(R.id.tv);
    tv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            File file = new File(filePath);
            try {
                Intent intent = new Intent(android.content.Intent.ACTION_SEND);
                intent.putExtra(Intent.EXTRA_EMAIL, "");
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
                if (getDeviceBrand().toUpperCase().contains("HONOR") || getDeviceBrand().toUpperCase().contains("HUAWEI") || getDeviceBrand().toUpperCase().contains("NUBIA")) {
                    intent.setClassName(NARMAL_PHONE[0], NARMAL_PHONE[1]);
                } else if (getDeviceBrand().toUpperCase().contains("XIAOMI") || getDeviceBrand().toUpperCase().contains("XIAOMI")) {
                    intent.setClassName(MIUI_PHONE[0], MIUI_PHONE[1]);
                } else if (getDeviceBrand().toUpperCase().contains("SAMSUNG")) {
                    intent.setClassName(SAMSUNG_PHONE[0], SAMSUNG_PHONE[1]);
                }
                startActivity(Intent.createChooser(intent, "分享一下"));
            } catch (Exception e) {
                e.printStackTrace();
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setData(Uri.parse("mailto:"));
                intent.putExtra(Intent.EXTRA_EMAIL, "");
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
                startActivity(Intent.createChooser(intent, "分享一下"));
            }

        }
    });
}

  /**
   * 獲取手機廠商
   *
   * @return 手機廠商
   */
  public static String getDeviceBrand() {
      Log.e("--獲取手機廠商--:", android.os.Build.BRAND);
      return android.os.Build.BRAND;
  }
}

????關(guān)于獲取第三方應用Activity名稱的方法:
????adb shell dumpsys activity | findstr "mFocusedActivity"

題后語

????第一次嘗試寫技術(shù)文檔,難免會有瑕疵,希望同學們能夠積極指正。能幫到你是我的榮幸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,330評論 0 17
  • 2018年Android 面試題 IT開發(fā)仔2018-03-21 15:26:46 在這“金三銀四”的季節(jié),我準備...
    王培921223閱讀 2,609評論 3 24
  • 0.Android手機操作系統(tǒng)的四層架構(gòu)? Applications , Application Framewor...
    lucas777閱讀 8,144評論 0 16
  • 趁年輕,多讀書,多游歷,多交往。經(jīng)歷的越少,人越會對環(huán)境不滿意,消極的認為是環(huán)境制約了自己的發(fā)展。見識的越多,人越...
    耿渡輝閱讀 160評論 0 0
  • 七律 清明思親 中華新韻九文 清明迫近思先人, 五內(nèi)難平欲斷魂。 勤儉持家豐日月, 老實做事潤乾坤。 長賢蔭蔽人...
    老財神閱讀 191評論 0 1

友情鏈接更多精彩內(nèi)容