我怎么能得到默认短信应用程序的包名?

时间:2014-09-22 07:54:02

标签: android sms

由于默认短信应用程序在4.4中添加,我无法打开这样的默认短信应用程序:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

那我怎么能得到默认短信应用的包名,所以我可以直接在我的应用中打开它?

3 个答案:

答案 0 :(得分:8)

接受的答案对我不起作用(而且似乎相当不可靠)。

获取包名称的更好方法是

Telephony.Sms.getDefaultSmsPackage(context);

这需要API 19 +

答案 1 :(得分:6)

// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.4_r1/android/provider/Settings.java#Settings.Secure.0SMS_DEFAULT_APPLICATION

public static final String SMS_DEFAULT_APPLICATION =" sms_default_application";

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.4_r1/com/android/internal/telephony/SmsApplication.java#267

if(Utils.hasKikKat()) {
    String defaultApplication = Settings.Secure.getString(getContentResolver(),  SMS_DEFAULT_APPLICATION);
    PackageManager pm = context.getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage(defaultApplication );
      if (intent != null) {
        context.startActivity(intent);
      }
} else {
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.setType("vnd.android-dir/mms-sms");
    startActivity(intent);
}

答案 2 :(得分:3)

这是你如何做到的:

@Nullable
public static String getDefaultSmsAppPackageName(@NonNull Context context) {
    if (VERSION.SDK_INT >= VERSION_CODES.KITKAT)
        return Telephony.Sms.getDefaultSmsPackage(context);
    else {
        Intent intent = new Intent(Intent.ACTION_VIEW)
                .addCategory(Intent.CATEGORY_DEFAULT).setType("vnd.android-dir/mms-sms");
        final List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(intent, 0);
        if (resolveInfos != null && !resolveInfos.isEmpty())
            return resolveInfos.get(0).activityInfo.packageName;
        return null;
    }
}