[英]Android 4.4 SMS: How to insert message into SMS provider in android 4.4 by setting my app as default sms app
[英]How to unset my sms app as default app in Android
我想取消設置我的 SMS 應用程序是否為 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);
但我想將我的短信應用取消設置為默認應用。 我怎樣才能做到這一點?
這里有一點要注意:我已經安裝了消息經典應用程序。 從該應用程序中,我可以將我的短信應用程序取消設置為默認設置。
在你費心閱讀這個答案之前,你可能會先看看這個更簡單的選項(我希望我在工作之前就已經想到了)。 如果您想讓用戶選擇要設置的應用程序,而不是讓系統恢復到它決定的任何應用程序,那么這個答案仍然很方便。
要取消選擇您的應用程序作為默認 SMS 應用程序,您可以讓用戶選擇另一個符合條件的應用程序作為默認應用程序代替您的應用程序,並使用該包名稱觸發ACTION_CHANGE_DEFAULT
Intent
。
為了簡化過程,我編寫了selectDefaultSmsPackage()
方法,該方法將查找所有接受"android.provider.Telephony.SMS_DELIVER"
廣播的應用程序(不包括當前包),並提示用戶一個列表可供選擇。 這是一個相當幼稚的過濾標准,但最糟糕的情況是選定的應用程序無法成功設置為默認值。
從列表中選擇所需的應用程序后,通常會出現是/否驗證對話框。 當Activity
收到結果時,會將所選應用程序的包名稱與當前設置的默認值進行比較以確定成功。 由於一些用戶報告在這種情況下結果代碼不可靠,檢查當前默認值是保證正確成功結果的唯一方法。
我們將使用自定義Dialog
來列出符合條件的應用程序的顯示名稱和圖標。 創建AppsDialog
的Activity
必須實現其OnAppSelectedListener
接口。
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;
...
}
}
我們需要以下 POJO 類來保存相關的應用程序信息。
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
。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="1dp"
android:paddingBottom="1dp"
android:paddingStart="8dp"
android:paddingEnd="8dp">
<ImageView android:id="@+id/icon"
android:layout_width="36dp"
android:layout_height="36dp" />
<TextView android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:ellipsize="marquee" />
</LinearLayout>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.