web-dev-qa-db-ja.com

アプリをデフォルトとして設定するにはどうすればよいですかSMSアプリ?

私は このチュートリアル を使用してアプリをデフォルトとして設定していますSMSアプリですが、何らかの理由で、使用可能なオプションのリストにアプリが表示されません。可能な限りこれを調査しようとしましたが、すべてが同じチュートリアルを指しているか、古いものです。<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>
18
Jayce

(システムに関する限り)アプリをデフォルトのメッセージングアプリとして選択できるようにするには、そのブログ投稿に示されているように、コンポーネントのクラスが実際に存在するかどうかにかかわらず、すべてのコンポーネントをマニフェストにリストする必要がありますか否か。

<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:permission="Android.permission.SEND_RESPOND_VIA_MESSAGE"
            Android:exported="true" >
            <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>

システムはアプリのマニフェストを検査して、アプリがデフォルトのメッセージングアプリとして機能できるかどうかを判断するだけなので、アプリがデフォルトの選択リストに表示されるために、これらのコンポーネントのクラスがすべて存在する必要はありません。これは学習やテストに役立ちますが、アプリがユーザーのデフォルトのメッセージングクライアントとして機能する場合は、指定されたすべてのコンポーネントを完全に実装する必要があります。

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" />

指定されたアクションを実行しようとしたときにSEND_SMSREAD_SMS、またはWRITE_SMS権限がない場合、SecurityExceptionがスローされます。ただし、RECEIVE_*権限がないと、アプリに適切なブロードキャストが配信されず、これらの機能をテストしても何も起こらないように見える場合があります。

28
Mike M.