我想取消我的短信应用程序是否为android中的默认应用程序。我正在学习本教程:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html
我可以通过以下代码将我的短信应用设置为默认短信应用:
Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName());
startActivity(intent);
但我想取消我的短信应用作为默认应用。我怎么能这样做?
这里有一点需要注意:我已经安装了消息传递经典应用程序。从那个应用程序,我可以取消我的短信应用程序默认。
答案 0 :(得分:5)
在你仔细阅读这个答案之前,你可能会看一下this much simpler option(我希望在开始这个工作之前我已经想过了)。如果您想让用户选择要设置的应用程序,而不是让系统恢复到它所决定的任何一个,那么这个答案仍然很方便。
要取消选择您的应用作为默认短信应用,您可以让用户选择其他符合条件的应用作为默认应用替代您的应用,并使用该套餐触发ACTION_CHANGE_DEFAULT
Intent
名。
为了简化这个过程,我编写了selectDefaultSmsPackage()
方法,该方法将找到所有接受"android.provider.Telephony.SMS_DELIVER"
广播的应用程序(不包括当前包),并提示用户提供可供选择的列表。这是一个相当天真的过滤标准,但最糟糕的情况是所选择的应用程序才能成功设置为默认值。
从列表中选择所需的应用程序后,将显示通常的是/否验证对话框。当Activity
收到结果时,会将所选应用程序的程序包名称与当前设置为默认值的程序包名称进行比较,以确定是否成功。由于一些用户报告在这种情况下结果代码不可靠,检查当前默认值是保证正确成功结果的唯一方法。
我们将使用自定义Dialog
列出符合条件的应用的显示名称和图标。创建Activity
的{{1}}必须实现其AppsDialog
接口。
OnAppSelectedListener
我们需要以下POJO课程来保存相关的应用信息。
public class MainActivity extends Activity
implements AppsDialog.OnAppSelectedListener {
...
private static final int DEF_SMS_REQ = 0;
private AppInfo selectedApp;
private void selectDefaultSmsPackage() {
final List<ResolveInfo> receivers = getPackageManager().
queryBroadcastReceivers(new Intent(Sms.Intents.SMS_DELIVER_ACTION), 0);
final ArrayList<AppInfo> apps = new ArrayList<>();
for (ResolveInfo info : receivers) {
final String packageName = info.activityInfo.packageName;
if (!packageName.equals(getPackageName())) {
final String appName = getPackageManager()
.getApplicationLabel(info.activityInfo.applicationInfo)
.toString();
final Drawable icon = getPackageManager()
.getApplicationIcon(info.activityInfo.applicationInfo);
apps.add(new AppInfo(packageName, appName, icon));
}
}
Collections.sort(apps, new Comparator<AppInfo>() {
@Override
public int compare(AppInfo app1, AppInfo app2) {
return app1.appName.compareTo(app2.appName);
}
}
);
new AppsDialog(this, apps).show();
}
@Override
public void onAppSelected(AppInfo selectedApp) {
this.selectedApp = selectedApp;
Intent intent = new Intent(Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, selectedApp.packageName);
startActivityForResult(intent, DEF_SMS_REQ);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case DEF_SMS_REQ:
String currentDefault = Sms.getDefaultSmsPackage(this);
boolean isDefault = selectedApp.packageName.equals(currentDefault);
String msg = selectedApp.appName + (isDefault ?
" successfully set as default" :
" not set as default");
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
break;
...
}
}
public class AppInfo {
String appName;
String packageName;
Drawable icon;
public AppInfo(String packageName, String appName, Drawable icon) {
this.packageName = packageName;
this.appName = appName;
this.icon = icon;
}
@Override
public String toString() {
return appName;
}
}
类创建一个简单的AppsDialog
可用默认值,并通过界面将选择内容传递回ListView
。
Activity
public class AppsDialog extends Dialog
implements OnItemClickListener {
public interface OnAppSelectedListener {
public void onAppSelected(AppInfo selectedApp);
}
private final Context context;
private final List<AppInfo> apps;
public AppsDialog(Context context, List<AppInfo> apps) {
super(context);
if (!(context instanceof OnAppSelectedListener)) {
throw new IllegalArgumentException(
"Activity must implement OnAppSelectedListener interface");
}
this.context = context;
this.apps = apps;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("Select default SMS app");
final ListView listView = new ListView(context);
listView.setAdapter(new AppsAdapter(context, apps));
listView.setOnItemClickListener(this);
setContentView(listView);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
((OnAppSelectedListener) context).onAppSelected(apps.get(position));
dismiss();
}
private class AppsAdapter extends ArrayAdapter<AppInfo> {
public AppsAdapter(Context context, List<AppInfo> list) {
super(context, R.layout.list_item, R.id.text, list);
}
public View getView(int position, View convertView, ViewGroup parent) {
final AppInfo item = getItem(position);
View v = super.getView(position, convertView, parent);
((ImageView) v.findViewById(R.id.icon)).setImageDrawable(item.icon);
return v;
}
}
}
使用以下项目布局ArrayAdapter
。
list_item