今天使用了autoLink ,于是 摘抄了可能會出現(xiàn)了問題 留待他用
通過看Log可以發(fā)現(xiàn)懦胞,系統(tǒng)拋出了ActivityNotFoundException異常智厌,并且Exception的getMessage中包含"mailto:xxxx@xxx.xxx"字樣属划,當(dāng)時第一反應(yīng)是設(shè)置Thread.uncaughtExceptionHandler雀哨,判斷如果異常的類型是ActivityNotFoundException并且Error Message中有"mailto"字樣直接讓uncaughtException函數(shù)返回埋凯,試了一下锅减,程序確實沒掛掉脆诉,竊喜中甚亭,但是接下來點擊了一下屏幕贷币,5秒鐘后ANR了,好吧這個方法不行亏狰。
又想到當(dāng)點擊鏈接后會調(diào)用郵件客戶端發(fā)郵件役纹,肯定有startActivity的調(diào)用,于是重載Activity的startActivity函數(shù)暇唾,把參數(shù) intent的內(nèi)容打出來(直接toString()就行了)促脉,發(fā)現(xiàn)在Intent的內(nèi)容是ACTIVION_VIEW,并有extra data:mailto:xxxx@xxx.xxx信不,所以就通過intent包含的信息判斷如果包含mailto字樣就認(rèn)為是系統(tǒng)調(diào)用郵件客戶端發(fā)郵件嘲叔,此時判斷系統(tǒng)中是否有郵件客戶端可處理這個請求,如果沒有就把這個startActivity事件攔截下來抽活。
@Overridepublic void startActivity(Intent intent) { if (intent.toString().indexOf("mailto") != -1) { // Any way to judge that this is to sead an email PackageManager pm = getPackageManager(); // The first Method Listactivities = pm.queryIntentActivities(intent, 0);
if (activities == null || activities.size() == 0) {
// Do anything you like, or just return
return;
}
// Another method
// ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
// if (resolveInfo == null)
// Yet another metod
// Intent.createChooser(intent, "Choose email client");
}
super.startActivity(intent);
}
第一種和第二種都是通過PackageManager判斷是否有可以處理這個Intent的請求的組件硫戈,如果沒有就直接讓startActivity返回,在返回之前你想干嘛干嘛下硕,第三種方法是通過 Intent.createChoose手動彈出一個選擇器丁逝,這個方法記得以前用是不行的,這次試了下竟然可以梭姓,難道是我記錯了霜幼?反正用前兩種方法就好了。
不只是郵件誉尖,如果你想通過以下代碼跳轉(zhuǎn)到應(yīng)用市場讓用戶為你的應(yīng)用評分
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=" + getPackageName()));
startActivity(intent);