在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); }
作者:jinjin10086 发表于2017/6/27 15:15:17 原文链接
阅读:15 评论:0 查看评论