Android 意图没有响应提示用户设置SMS的默认处理程序
我目前无法让应用程序向用户发送对话,以设置API 29上短信的默认处理程序 我最初跟着 它不起作用,所以我环顾四周,看到了这个: 因此,我跟随并将该片段添加到清单XML中(没有实际实现,正如StackOverflow用户在文章中所说的)。不幸的是,每次我单击启动Android 意图没有响应提示用户设置SMS的默认处理程序,android,android-studio,kotlin,android-intent,Android,Android Studio,Kotlin,Android Intent,我目前无法让应用程序向用户发送对话,以设置API 29上短信的默认处理程序 我最初跟着 它不起作用,所以我环顾四周,看到了这个: 因此,我跟随并将该片段添加到清单XML中(没有实际实现,正如StackOverflow用户在文章中所说的)。不幸的是,每次我单击启动操作\u更改\u默认值意图的按钮时,除了日志之外,什么都没有发生 我的主要活动有以下onCreate: override fun onCreate(savedInstanceState: Bundle?) { su
操作\u更改\u默认值
意图的按钮时,除了日志之外,什么都没有发生
我的主要活动有以下onCreate:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var btn = findViewById<Button>(R.id.button3)
btn.setOnClickListener {
Log.d("TAG", "Sending change default intent")
val setSmsAppIntent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT)
setSmsAppIntent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName)
startActivityForResult(setSmsAppIntent, CHANGE_SMS_DEFAULT_RESULT)
}
}
override-fun-onCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var btn=findViewById(R.id.button3)
btn.setOnClickListener{
Log.d(“标记”,“发送更改默认意图”)
val SETSMSAppinent=Intent(Telephony.Sms.Intents.ACTION\u CHANGE\u默认值)
setSMApp.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME,packageName)
startActivityForResult(设置满足、更改\u短信\u默认\u结果)
}
}
舱单:
如果你能帮忙,我将不胜感激。提前谢谢
我的minSdkVersion
是19
编辑:我刚刚在KitKat(API 19)上的emulator上尝试了这一点,它起了作用-但在Q(API 29)上没有。请尝试下面的代码
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
RoleManager roleManager = mContext.getSystemService(RoleManager.class);
// check if the app is having permission to be as default SMS app
boolean isRoleAvailable = roleManager.isRoleAvailable(RoleManager.ROLE_SMS);
if (isRoleAvailable){
// check whether your app is already holding the default SMS app role.
boolean isRoleHeld = roleManager.isRoleHeld(RoleManager.ROLE_SMS);
if (isRoleHeld){
Intent roleRequestIntent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS);
startActivityForResult(roleRequestIntent,requestCode);
}
}
} else {
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, defaultSystemApp);
startActivityForResult(intent, requestCode);
}
将此权限添加到清单中
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.app.role.SMS"/>
</intent-filter>
我不得不修改Praveen的代码以使其正常工作。主要区别在于if(IsroleHold)。下面是它的样子
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
RoleManager roleManager = getApplicationContext().getSystemService(RoleManager.class);
// check if the app is having permission to be as default SMS app
assert roleManager != null;
boolean isRoleAvailable = roleManager.isRoleAvailable(RoleManager.ROLE_SMS);
if (isRoleAvailable){
// check whether your app is already holding the default SMS app role.
boolean isRoleHeld = roleManager.isRoleHeld(RoleManager.ROLE_SMS);
if (!isRoleHeld){
Intent roleRequestIntent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS);
startActivityForResult(roleRequestIntent,resultCode);
}
}
} else {
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getApplicationContext().getPackageName());
startActivityForResult(intent, resultCode);
}
试试这个代码,我觉得很好用
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
//String mypackagename = getPackageName();
if(Telephony.Sms.getDefaultSmsPackage(this)!=null){
if (Telephony.Sms.getDefaultSmsPackage(this).equals(getPackageName())){
//todo go nain activity
}else{
Intent setSmsAppIntent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
setSmsAppIntent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME,getPackageName());
startActivityForResult(setSmsAppIntent, 1);
}
}else{toast("no tlphony");}
}
else{
RoleManager rolemanager = getApplicationContext().getSystemService(RoleManager.class);
if (rolemanager.isRoleAvailable(RoleManager.ROLE_SMS)){
if (rolemanager.isRoleHeld(RoleManager.ROLE_SMS)){
//todo go nain activity
}
else{
Intent roleRequestIntent = rolemanager.createRequestRoleIntent(RoleManager.ROLE_SMS);
startActivityForResult(roleRequestIntent,1);
}
}
}
if(Build.VERSION.SDK\u INT
在Q上,如果通过设备设置打开可用默认应用列表,您的应用是否会显示在该列表中?