如何将短信应用程序设置为Android中的默认应用程序编程

pdtvr36n  于 2023-09-29  发布在  Android
关注(0)|答案(8)|浏览(202)

我开发了一个安卓应用程序,用于接收来自特定号码的短信。它可以标记为从该号码读取短信。要将短信标记为已读,应用程序需要设置为默认值。如何在Android中以编程方式将应用程序设置为默认?

vdgimpew

vdgimpew1#

据我所知,您需要要求用户在启动应用程序时将您的应用程序设置为默认消息应用程序。要做到这一点,请使用以下代码:
intent-filter下面设置您要显示的活动。在本例中,我考虑了“DefaultSMSAppresserActivity”

<activity android:name=".DefaultSMSAppChooserActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.APP_MESSAGING" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

调用下面的方法来显示他/她的设备上所有可用的消息传递应用程序,包括您的默认选择。

public static void openSMSappChooser(Context context) {
    PackageManager packageManager = context.getPackageManager();
    ComponentName componentName = new ComponentName(context, DefaultSMSAppChooserActivity.class);
    packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    Intent selector = new Intent(Intent.ACTION_MAIN);
    selector.addCategory(Intent.CATEGORY_APP_MESSAGING);
    selector.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(selector);

    packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP);
}

您可以根据需要在任何地方使用上述方法。
希望这对你有帮助!!!

hi3rlvi2

hi3rlvi22#

你不能
第三方开发者不能将自己的应用设置为默认应用。只有您的应用的用户可以在自己的设备上执行此操作。
无论如何,您可以通过Intent-Filter注册您的应用程序作为消息传递应用程序

w8biq8rn

w8biq8rn3#

在清单文件中声明此内容

<intent-filter >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/sms" />
</intent-filter>

我不确定的哑剧类型,但请检查适当的哑剧类型的消息,因为它是非常重要的。

d7v8vwbk

d7v8vwbk4#

您可以从official google messenger复制粘贴清单来检查它是否工作link

<intent-filter>
  <action android:name="android.intent.action.MAIN" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:mimeType="vnd.android-dir/mms-sms" />
</intent-filter>
0yg35tkg

0yg35tkg5#

旧的方法将不会在Android 10上运行这些是你可以用来请求成为默认应用程序的代码

请求成为android 10默认设置 * 面向java开发者

public void makeMyAppDefaultRequest(String packageName){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        RoleManager roleManager =getSystemService(RoleManager.class);
        if (roleManager.isRoleAvailable(RoleManager.ROLE_SMS)) {
            if (roleManager.isRoleHeld(RoleManager.ROLE_SMS)) {
                requestPermission()
            } else {
                Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS);
                startActivityForResult(intent, 101);
            }
        } else {
            
        }
    } else {
        if (Telephony.Sms.getDefaultSmsPackage(this).equals(packageName)) {

        } else {
            Intent intent =new  Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
            intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName);
            startActivityForResult(intent, 101);
        }
    }
}

面向Kotlin开发者

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)) {
                askPermissions()
            } else {
                val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS)
                startActivityForResult(intent, MAKE_DEFAULT_APP_REQUEST)
            }
        } else {
            toast(R.string.unknown_error_occurred)
            finish()
        }
    } else {
        if (Telephony.Sms.getDefaultSmsPackage(this) == packageName) {
            askPermissions()
        } else {
            val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT)
            intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName)
            startActivityForResult(intent, MAKE_DEFAULT_APP_REQUEST)
        }
    }
}
yzuktlbb

yzuktlbb6#

您可以直接生成框架的对话框,要求将您的应用程序作为默认消息传递应用程序,从应用程序内部,使用以下IntentstartActivity

startActivity(Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT).putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName))
gcuhipw9

gcuhipw97#

2023年更新

如这里的文档https://developer.android.com/reference/androidx/core/role/RoleManagerCompat#ROLE_SMS()当您在清单中定义这些类型的组件时,系统会将您的应用视为SMS角色:

<activity>
    <intent-filter>
        <action android:name="android.intent.action.SENDTO" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="smsto" />
    </intent-filter>
</activity>
<service android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE">
    <intent-filter>
        <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="smsto" />
    </intent-filter>
</service>
<receiver android:permission="android.permission.BROADCAST_SMS">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_DELIVER" />
    </intent-filter>
</receiver>
<receiver android:permission="android.permission.BROADCAST_WAP_PUSH">
    <intent-filter>
        <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
        <data android:mimeType="application/vnd.wap.mms-message" />
    </intent-filter>
</receiver>

另外,不要忘记定义权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.WRITE_SMS"/>
cnh2zyt3

cnh2zyt38#

你不能强迫它,你也不应该这样做。你可以做的是让你的应用程序知道你可以打开的文件类型。用户得到标准的“你希望使用什么程序”对话框,并且用户可以选择一些东西作为默认值。如果用户已经选择了一个默认值,他/她需要在对话框出现之前撤销它(显然,否则“默认值”不会有很大的效果,现在不是吗?)

相关问题