【问题标题】:How do I set my app as the default SMS app?如何将我的应用设置为默认短信应用?
【发布时间】:2018-04-03 05:34:05
【问题描述】:

我正在关注this tutorial 将我的应用设置为默认短信应用,但由于某种原因,我的应用未出现在可用选项列表中。我试图尽可能多地对此进行研究,但一切都指向同一个教程,或者已经过时了。我也需要<receiver> 吗?有人可以解释我做错了什么吗?

代码:

@Override
protected void onResume()
{
    super.onResume();
    Log.i("MainAcitvity", "On Resume Called");
    // Only do these checks/changes on KitKat+, the "mSetDefaultSmsLayout" has its visibility
    // set to "gone" in the xml layout so it won't show at all on earlier Android versions.
    final String myPackageName = getPackageName();

    if (Utility.hasKitKat())
    {
        if (Utility.isDefaultSmsApp(this))
        {
            // This app is the default, remove the "make this app the default" layout and
            // enable message sending components.
            mSetDefaultSmsLayout.setVisibility(View.GONE);
        }
        else
        {
            Log.i("MainActivity", "Not Default App");
            // Not the default, show the "make this app the default" layout and disable
            // message sending components.
            mSetDefaultSmsLayout.setVisibility(View.VISIBLE);

            Button button = (Button) findViewById(R.id.set_default_sms_button);
            button.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View view)
                {                        
                    Log.i("MainActivity", "Button Pushed");
                    //Utility.setDefaultSmsApp(MainActivity.this);
                    Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                    intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myPackageName);
                    startActivity(intent);
                }
            });
        }
    }
}

清单:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <action android:name="android.intent.action.SEND" />
        <action android:name="android.intent.action.SENDTO" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="sms" />
        <data android:scheme="smsto" />
        <data android:scheme="mms" />
        <data android:scheme="mmsto" />
    </intent-filter>
</activity>

【问题讨论】:

    标签: android sms default telephony


    【解决方案1】:

    为了使您的应用有资格被选为默认消息传递应用(就系统而言),其清单必须列出该博客文章中描述的四个组件中的每一个,无论这些组件的类实际存在和功能,或不存在。类名可以是您喜欢的任何有效名称,但每个组件的其余部分应该几乎完全如图所示:

    <manifest>
        ...
        <application>
            <!-- BroadcastReceiver that listens for incoming SMS messages -->
            <receiver
                android:name=".SmsReceiver"
                android:permission="android.permission.BROADCAST_SMS">
                <intent-filter>
                    <action android:name="android.provider.Telephony.SMS_DELIVER" />
                </intent-filter>
            </receiver>
    
            <!-- BroadcastReceiver that listens for incoming MMS messages -->
            <receiver
                android:name=".MmsReceiver"
                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>
    
            <!-- Activity that allows the user to send new SMS/MMS messages -->
            <activity android:name=".ComposeSmsActivity">
                <intent-filter>
                    <action android:name="android.intent.action.SEND" />
                    <action android:name="android.intent.action.SENDTO" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data android:scheme="sms" />
                    <data android:scheme="smsto" />
                    <data android:scheme="mms" />
                    <data android:scheme="mmsto" />
                </intent-filter>
            </activity>
    
            <!-- Service that delivers messages from the phone "quick response" -->
            <service
                android:name=".HeadlessSmsSendService"
                android:exported="true"
                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="sms" />
                    <data android:scheme="smsto" />
                    <data android:scheme="mms" />
                    <data android:scheme="mmsto" />
                </intent-filter>
            </service>
        </application>
    </manifest>
    

    由于系统仅检查应用程序的清单以确定它是否可以充当默认消息传递应用程序,因此您实际上不需要任何这些类,尽管您可能需要抑制一些警告/错误或提供存根类,让您的 IDE 满意。

    显然,如果您的应用要充当用户的默认消息传递客户端,它应该完全实现所有指定的组件。但是,不完整的实现肯定是有用的。例如,在学习和测试期间,或者在只需要临时访问部分权限的应用中,例如消息备份和恢复应用。

    如果您确实打算执行任何与 SMS/MMS 相关的任务,您还需要相关权限。尽管系统在确定符合条件的默认应用程序候选者时显然不会检查这些,但它们的相应操作需要以下权限:

    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    

    如果您在给定操作发生时缺少相关权限,则会抛出SecurityException,尽管有些可能很容易错过;例如,如果在系统尝试将传入的 SMS 传送到清单注册的接收器时缺少RECEIVE_SMS 权限。如果您发现意外行为,请务必检查您的日志,即使没有明显的崩溃。

    【讨论】:

    • M: 'HeadlessSmsSendService' 是 Android 服务类吗?
    • @VineeshTP 是的。任何带有&lt;service&gt; 元素的组件都是Service 子类。
    • @MikeM。如果我不做任何其他事情,收到的消息会不会出现在我正常的短信应用程序的收件箱中?就像他们会消失一样?因为我想在默认应用程序中正常查看短信,但使用我的应用程序是因为我想实现短信网关。
    • @BlackDivine 我不确定我是否明白你在问什么。如果您的应用程序是默认消息应用程序,则它负责保存传入的短信。如果没有,那么是的,它们几乎消失了。
    • @alexsamsung 你是这个意思吗? stackoverflow.com/q/42676866
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多