Android RoleManager 为自己的包删除角色 RoleManager.ROLE_SMS

Posted

技术标签:

【中文标题】Android RoleManager 为自己的包删除角色 RoleManager.ROLE_SMS【英文标题】:Android RoleManager remove role RoleManager.ROLE_SMS for own package 【发布时间】:2021-04-09 09:27:53 【问题描述】:

我有只备份和恢复短信的短信备份应用 所以当我恢复短信时,我需要设置默认按摩应用程序。然后在恢复后我不需要保持默认的按摩应用程序。

所以我的问题是如何删除我的应用默认为按摩应用。 也适用于老版本的belove Android Q

代码-

fun saveSms(values: ContentValues) 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) 
            val roleManager = getSystemService(RoleManager::class.java)
            if (roleManager.isRoleAvailable(RoleManager.ROLE_SMS)) 
                if (roleManager.isRoleHeld(RoleManager.ROLE_SMS)) 
                    contentResolver.insert(Telephony.Sms.CONTENT_URI, values)
                 else 
                    val i = roleManager
                        .createRequestRoleIntent(RoleManager.ROLE_SMS)

                    smsRunnable = Runnable 
                        saveSms(values)
                        smsRunnable = null
                    
                    startActivityForResult(i, 5444)
                
            
            return
        

        if (Telephony.Sms.getDefaultSmsPackage(this) != packageName) 
            val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT)
            intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName)
            smsRunnable = Runnable 
                saveSms(values)
                smsRunnable = null
            
            startActivityForResult(intent, 5444)
         else 
            contentResolver.insert(Telephony.Sms.CONTENT_URI, values)
        
    

【问题讨论】:

【参考方案1】:

对于 android Q 之前的版本,我使用 SharedPreferences。

String appDefault = getSharedPreferences("default", MODE_PRIVATE).getString("appDefault", "com.android.contacts");
    String paquete = getPackageName();
    String appCallerActual = getSystemService(TelecomManager.class).getDefaultDialerPackage();
    String cambio = appCallerActual.equals(paquete) ? appDefault : paquete;
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) 
        RoleManager roleManager = (RoleManager) getSystemService(Context.ROLE_SERVICE);
        Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_DIALER);
        Log.d(TAG, "isRoleAvailable: " + roleManager.isRoleAvailable(RoleManager.ROLE_DIALER));
        Log.d(TAG, "isRoleHeld: " + roleManager.isRoleHeld(RoleManager.ROLE_DIALER));
        //HERE I CAN'T CHANGE TO OTHER APP, SORRY;
        startActivityForResult(intent, CODE_REQUEST);

    else
        Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER);
        intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME,
                cambio);
        startActivityForResult(intent,CODE_REQUEST);
    

在 Android Q 的情况下,我无法做到。

【讨论】:

以上是关于Android RoleManager 为自己的包删除角色 RoleManager.ROLE_SMS的主要内容,如果未能解决你的问题,请参考以下文章

web.config 中没有 roleManager 标签

使用 MVC 错误配置 roleManager 提供程序

RoleManager 和 SimpleMembershipProvider 不能与 AuthorizeAttribute 一起使用

在接口中使用 AspNetCore.Identity RoleManager 和 UserManager

roleManager与角色管理授权

Android测试随笔获得App的包名和启动Activity