避免使用“完成操作”对话框发送短信

时间:2014-01-16 12:31:40

标签: android

我有以下用于打开发送短信窗口的代码:

Intent sendIntent = new Intent(Intent.ACTION_VIEW);
sendIntent.putExtra("sms_body", msgString);
sendIntent.setType("vnd.android-dir/mms-sms");
activity.startActivity( sendIntent );

上面的代码避免了当有两个应用程序注册用于发送短信时Android显示的“使用完整操作”对话框。

此代码适用于某些设备上的错误,因此是否有任何通用解决方案可以在所有设备上运行,打开发送短信屏幕而不显示“使用完整操作”对话框。

3 个答案:

答案 0 :(得分:1)

请尝试此代码

public void sendSMS()
{
    SmsManager sm = SmsManager.getDefault();
    String number = "123456789";
    String msg = "Hello";
    sm.sendTextMessage(number, null, msg, null, null);
}

答案 1 :(得分:1)

使用以下代码

private void send() {
    Intent shareIntent = new Intent(Intent.ACTION_VIEW);
    shareIntent.setType("vnd.android-dir/mms-sms");
    shareIntent.putExtra("sms_body", "hello this is test");

    List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(shareIntent, 0);
    if (!resInfo.isEmpty()) {
        for (ResolveInfo resolveInfo : resInfo) {
            String packageName = resolveInfo.activityInfo.packageName;
            if (packageName.equals("com.android.mms")) {
                shareIntent.setPackage(packageName);
                            break;
            } else {
                // Else show chooser
            }
        }
        startActivity(shareIntent);
    }
}

针对特定活动的更新。

com.android.mms申请,.ui.ConversationComposerui.ComposeMessageMms共有两项活动。您只能使用其中两个。正如我上面的回答,这是使用.ui.ConversationComposer。所以要在代码下面使用第二个活动。

try {
    Intent shareIntent = new Intent(Intent.ACTION_VIEW);
    shareIntent.setType("vnd.android-dir/mms-sms");
    shareIntent.putExtra("sms_body", "hello this is test"); 
    shareIntent.setComponent(new ComponentName("com.android.mms","com.android.mms.ui.ComposeMessageMms"));
    startActivity(shareIntent);
} catch (ActivityNotFoundException exception) {
    // This will happen if Device have no MMS application. Handle this exception. 
}

这将显示Android默认应用程序发送彩信。

答案 2 :(得分:0)

您可以在使用之前解决意图,以查看匹配的内容:

List<ResolveInfo> infos = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo info : infos) {
    // Searching for a System installed package
    if (info.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM > 0) {
        intent.setComponent(new ComponentName(
               info.activityInfo.applicationInfo.packageName,
               info.activityInfo.name));
    }
}

这尚未经过测试,但应该可以使用,因为标志'SYSTEM'显然是系统映像中应用的标志。

如果这不起作用,您可以获取列表中的第一项,或搜索包名称,例如googleandroid,或查看preferredOrder是否可以任何帮助。

修改

queryIntentActivities当然是queryIntentActivitiesActivityInfo.FLAG_SYSTEMApplicationInfo.FLAG_SYSTEM。我写这篇文章的时候一定很累...