在Android開發的過程中,不可能需要的時候都自己開發,往往通過打開其他的應用實作需要的效果,如拍照、發短信、發郵件、撥号等等。那麼我們如何打開其他的應用呢?
這個簡單,打電話:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
Uri uri = Uri.parse("tel:15319903194");
intent.setData(uri);
startActivity(intent);
很簡單嘛。
真是這麼簡單嗎 ?
這個在我們使用的時候之是以都是正常的,主要原因是每個手機都有打電話的功能,但是我們在打開諸如發郵件、地圖等的時候還能這樣嗎?如果手機上沒有郵箱程式或者地圖程式會發生什麼?。
程式會崩潰!
是的,你的應用已經停止運作。
那麼我們應該如何避免這種情況呢?
那就是需要在啟動之前判斷下是不是存在能執行此Intent的程式。
PackageManager manager = getPackageManager();
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = resolveInfos.size() > 0;
if (isIntentSafe) {
startActivity(intent);
}
這樣做就不會出現崩潰的現象了,還可以在else的時候對使用者進行友好的提示操作。
下面我們看看打開應用的正确姿勢。
一、建構程式打開的Intent,設定相關的Uri,Action,額外資訊等。
二、檢查系統是否存在能執行此操作的應用,如果存在則執行,不存在進行友好的提示。
三、如果需要則對應用選擇器進行定義。
第一點,很明确,對自己的Intent進行定制化,這裡不再多說,最後會附上常用的設定。
第二點,就是上面的解決辦法。
第三點,如果滿足此操作的應用有多個,則系統會顯示預設的應用選擇器,注意此選擇器是可以設定預設的。
打開網頁、打開文本、地圖這些選擇預設是沒有問題呢。
但如果是分享等操作呢,這次分享到QQ,下次分享到微信這時候如果點了預設下次怎麼辦?是以需要對選擇器進行設定,去除預設的設定,如下:
Intent chooser = Intent.createChooser(intent, "請選擇要使用的應用")
文字為選擇器的标題,啟動Activity的時候傳入chooser即可實作設定。
最後附上常用的打開其他程式的設定:
1、打電話:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
Uri uri = Uri.parse("tel:15319903194");
intent.setData(uri);
PackageManager manager = getPackageManager();
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = resolveInfos.size() > 0;
if (isIntentSafe) {
startActivity(intent);
}
2、打開網站:
Uri uri = Uri.parse("http://www.java1234.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
Intent chooser = Intent.createChooser(intent, "請選擇要使用的應用");//提示使用者需要選擇的應用,隻有一個的時候不起作用
PackageManager manager = getPackageManager();
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = resolveInfos.size() > 0;
if (isIntentSafe) {
startActivity(chooser);
}
3、打開地圖:
Uri location = Uri.parse("geo:38.899533,-77.036476");
Intent intent = new Intent(Intent.ACTION_VIEW, location);
PackageManager manager = getPackageManager();
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = resolveInfos.size() > 0;
if (isIntentSafe) {
startActivity(intent);
}
4、發郵件:
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:[email protected]"));//發送目标
intent.putExtra(Intent.EXTRA_EMAIL,new String[]{"[email protected]","[email protected]"});//發送目标
intent.putExtra(Intent.EXTRA_CC,new String[]{"[email protected]","[email protected]"});//抄送人
intent.putExtra(Intent.EXTRA_BCC,new String[]{"[email protected]","[email protected]"});//密送人
intent.putExtra(Intent.EXTRA_SUBJECT,"E-mail标題");
intent.putExtra(Intent.EXTRA_TEXT,"E-mail内容E-mail内容E-mail内容E-mail内容E-mail内容");
PackageManager manager = getPackageManager();
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = resolveInfos.size() > 0;
if (isIntentSafe) {
startActivity(intent);
}
5、建立月曆活動(此處要判斷系統版本,必須是API14及以上):
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH){
Toast.makeText(this,"目前系統版本過低,不支援此功能",Toast.LENGTH_LONG).show();
return;
}
Intent intent = new Intent(Intent.ACTION_INSERT, CalendarContract.Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance();
beginTime.set(2015, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance();
endTime.set(2015, 0, 19, 10, 30);
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
intent.putExtra(CalendarContract.Events.TITLE, "活動标題");
intent.putExtra(CalendarContract.Events.EVENT_LOCATION, "活動說明");
PackageManager manager = getPackageManager();
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = resolveInfos.size() > 0;
if (isIntentSafe) {
startActivity(intent);
}
6、發短信:
Uri uri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra("sms_body", "短信内容");
PackageManager manager = getPackageManager();
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = resolveInfos.size() > 0;
if (isIntentSafe) {
startActivity(intent);
}
7、搜尋:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY,"搜尋的内容");
PackageManager manager = getPackageManager();
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = resolveInfos.size() > 0;
if (isIntentSafe) {
startActivity(intent);
}