在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:512@163.com"));//发送目标
intent.putExtra(Intent.EXTRA_EMAIL,new String[]{"123@qq.com","125553@qq.com"});//发送目标
intent.putExtra(Intent.EXTRA_CC,new String[]{"321@qq.com","321654@qq.com"});//抄送人
intent.putExtra(Intent.EXTRA_BCC,new String[]{"b321@qq.com","b321654@qq.com"});//密送人
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);
}