Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 意图没有响应提示用户设置SMS的默认处理程序_Android_Android Studio_Kotlin_Android Intent - Fatal编程技术网

Android 意图没有响应提示用户设置SMS的默认处理程序

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

我目前无法让应用程序向用户发送对话,以设置API 29上短信的默认处理程序

我最初跟着

它不起作用,所以我环顾四周,看到了这个:

因此,我跟随并将该片段添加到清单XML中(没有实际实现,正如StackOverflow用户在文章中所说的)。不幸的是,每次我单击启动
操作\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上,如果通过设备设置打开可用默认应用列表,您的应用是否会显示在该列表中?