package me.shouheng.utils.app; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; import android.net.Uri; import android.provider.MediaStore; import android.provider.Settings; import android.support.annotation.RequiresPermission; import java.util.ArrayList; import java.util.List; import me.shouheng.utils.UtilsApp; import static android.Manifest.permission.CALL_PHONE; /** * @author WngShhng ([email protected]) * @version 2019/5/7 23:09 */ public final class IntentUtils { /** * 判断指定的意图是否有效(有没有 Activity 可以处理它) * * @param intent 意图 * @return TRUE 表示可以处理 */ public static boolean isIntentAvailable(final Intent intent) { return UtilsApp.getApp() .getPackageManager() .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) .size() > 0; } /** * 获取匹配指定的意图的全部的 APP 的信息 * * @param intent 意图 * @return 应用信息列表 */ public static List<AppInfo> getMatchAppInfos(Intent intent) { PackageManager pm = UtilsApp.getApp().getPackageManager(); List<ResolveInfo> infos = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); List<AppInfo> appInfoList = new ArrayList<>(infos.size()); for (ResolveInfo resolveInfo : infos) { appInfoList.add(new AppInfo(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name, resolveInfo.loadLabel(pm).toString(), resolveInfo.loadIcon(pm))); } return appInfoList; } public static Intent getLaunchAppIntent(final String pkgName) { return getLaunchAppIntent(pkgName, false); } /** * 返回一个用来启动某个应用的意图 * * @param pkgName 应用的包名 * @param isNewTask 是否作为 NEW TASK 启动指定的应用 * @return 意图 */ public static Intent getLaunchAppIntent(final String pkgName, final boolean isNewTask) { PackageManager pm = UtilsApp.getApp().getPackageManager(); Intent intent = pm.getLaunchIntentForPackage(pkgName); return getIntent(intent, isNewTask); } public static Intent getLaunchSettingIntent(final String pkgName) { return getLaunchSettingIntent(pkgName, false); } /** * 返回一个用来打开某个应用的设置界面的意图 * * @param pkgName 应用的包名 * @return 意图 */ public static Intent getLaunchSettingIntent(final String pkgName, final boolean isNewTask) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + pkgName)); return getIntent(intent, isNewTask); } public static Intent getShareTextIntent(final String content) { return getShareTextIntent(content, false); } /** * 返回一个用来分享文本的意图 * * @param content 文本内容 * @param isNewTask 是否作为 NEW TASK 启动指定的应用 * @return 意图 */ public static Intent getShareTextIntent(final String content, final boolean isNewTask) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, content); return getIntent(intent, isNewTask); } public static Intent getDialIntent(final String phoneNumber) { return getDialIntent(phoneNumber, false); } /** * 返回一个用来拨打指定手机号码的意图 * * @param phoneNumber 手机号码 * @param isNewTask 是否作为 NEW TASK 启动指定的应用 * @return 意图 */ public static Intent getDialIntent(final String phoneNumber, final boolean isNewTask) { Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber)); return getIntent(intent, isNewTask); } @RequiresPermission(CALL_PHONE) public static Intent getCallIntent(final String phoneNumber) { return getCallIntent(phoneNumber, false); } /** * 返回一个用来拨打指定手机号码的意图 * * @param phoneNumber 手机号码 * @param isNewTask 是否作为 NEW TASK 启动指定的应用 * @return 意图 */ @RequiresPermission(CALL_PHONE) public static Intent getCallIntent(final String phoneNumber, final boolean isNewTask) { Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); return getIntent(intent, isNewTask); } public static Intent getSendSmsIntent(final String phoneNumber, final String content) { return getSendSmsIntent(phoneNumber, content, false); } /** * 返回一个用来发送短信的意图 * * @param phoneNumber 手机号码 * @param content 内容 * @param isNewTask 是否作为 NEW TASK 启动指定的应用 * @return 意图 */ public static Intent getSendSmsIntent( final String phoneNumber, final String content, final boolean isNewTask) { Uri uri = Uri.parse("smsto:" + phoneNumber); Intent intent = new Intent(Intent.ACTION_SENDTO, uri); intent.putExtra("sms_body", content); return getIntent(intent, isNewTask); } public static Intent getSendEmailIntent( final String emailAddress, final String subject, final String body) { return getSendEmailIntent(emailAddress, subject, body, false); } /** * 返回一个用来发送邮件的意图 * * @param emailAddress 目标邮箱地址 * @param subject 邮件主题 * @param body 邮件正文 * @param isNewTask 是否作为 NEW TASK 启动指定的应用 * @return 意图 */ public static Intent getSendEmailIntent(final String emailAddress, final String subject, final String body, final boolean isNewTask) { Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + emailAddress)); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_TEXT, body); intent.putExtra(Intent.EXTRA_EMAIL, emailAddress); return getIntent(intent, isNewTask); } public static Intent getOpenWebIntent(final String webUrl) { return getOpenWebIntent(webUrl, false); } /** * 返回一个用来打开指定的 url 的意图 * * @param webUrl 网页的 url * @param isNewTask 是否作为 NEW TASK 启动指定的应用 * @return 意图 */ public static Intent getOpenWebIntent(final String webUrl, final boolean isNewTask) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(webUrl)); return getIntent(intent, isNewTask); } public static Intent getLaunchMarketIntent(final String pkgName) { return getLaunchMarketIntent(pkgName, false); } /** * 返回一个用来打开应用商店的意图:优先使用 market 打开,如果没有可用的应用,就使用浏览器打开 * Google Play 的地址 * * @param pkgName 应用的包名 * @param isNewTask 是否作为 NEW TASK 启动指定的应用 * @return 意图 */ public static Intent getLaunchMarketIntent(final String pkgName, final boolean isNewTask) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + pkgName)); if (!isIntentAvailable(intent)) { intent = getOpenWebIntent("https://play.google.com/store/apps/details?id=" + pkgName); } return getIntent(intent, isNewTask); } public static Intent getCaptureIntent(final Uri outUri) { return getCaptureIntent(outUri, false); } /** * 返回一个用来拍摄图片的意图 * * @param outUri 输出的 uri 的地址 * @param isNewTask 是否作为 NEW TASK 启动指定的应用 * @return 意图 */ public static Intent getCaptureIntent(final Uri outUri, final boolean isNewTask) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, outUri); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); return getIntent(intent, isNewTask); } public static class AppInfo { public final String pkgName; public final String launcherName; public final String appName; public final Drawable launcherIcon; public AppInfo(String pkgName, String launcherName, String appName, Drawable launcherIcon) { this.pkgName = pkgName; this.launcherName = launcherName; this.appName = appName; this.launcherIcon = launcherIcon; } @Override public String toString() { return "AppInfo{" + "pkgName='" + pkgName + '\'' + ", launcherName='" + launcherName + '\'' + ", appName='" + appName + '\'' + ", launcherIcon=" + launcherIcon + '}'; } } /*----------------------------------inner methods--------------------------------------*/ private static Intent getIntent(final Intent intent, final boolean isNewTask) { if (intent == null) return null; return isNewTask ? intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) : intent; } private IntentUtils() { throw new UnsupportedOperationException("u can't initialize me!"); } }