web-dev-qa-db-ja.com

ハングアウト2.0でSMSサポートを有効にすると、アプリのSMS_RECEIVEDのBroadcastReceiverが壊れます

ハングアウト2.0のアップデートを受け取り、インストールしてSMS→_Turn on SMS_を有効にしました。これで、Android 4.3で実行されているアプリケーションは、SMSを受信できなくなりました。つまり、_SMS_RECEIVED_のBroadcastReceiverは呼び出されなくなりました。:

ハングアウト2.0で_Turn on SMS_を無効にするとすぐに、アプリはSMS_RECEIVEDインテントを再び受信できるようになります。

放送受信機はこのようにマニフェストに登録されています

AndroidManifest.xml

_…
<receiver Android:name=".SMSReceiver" >
    <intent-filter>
        <action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>
…
_

SMSReceiver.Java

_public class SMSReceiver extends BroadcastReceiver {

    private static final Log LOG = Log.getLog();

    @Override
    public void onReceive(Context context, Intent intent) {
            LOG.d("onReceive");
            …
    }
}
_

レシーバーの優先度をINT_MAXまたは999に変更しようとしましたが、これは---(インテントフィルターのドキュメントの時点で可能な最高の優先度 ですが、成功しませんでした。 _SMS_RECEIVED_インテントが送信順序で送信され、優先度の高いアプリにはブロードキャストを中止する機能があることを知っています。1 ただし、ハングアウト2.0が_SMS_RECEIVED_レシーバーを高い優先度で登録し、 abortBroadcast() を呼び出している可能性は低いため、他のアプリがインテントを受信できません。

さらに私を混乱させたのは、ハングアウト2.0をデフォルトとして使用してもPebbleがSMSを受信できることですSMSapp。Pebbleは何が違うのでしょうか? Pebbleの着信SMS通知は、Pebbleアプリによって受信される新しいSMSの通知ではなく、「新しいハングアウト」であることに気付きました。ハングアウトが着信SMSを受信することによって発生する「メッセージ」通知。したがって、Pebbleアプリは_SMS_RECEIVED_を使用して着信テキストメッセージを受信することもできません。

ちなみに、私はまだAndroid 4.3を使用しているため、この問題とはあまり関係ありません(ただし、私のアプリはSDKレベル19を対象としています、Android 4.4重要なのは)GoogleのAndroid Developers Blog post about new SMS API in KitKat 、は、 SMS_RECEIVEDであり、SMSをSMSプロバイダーに書き込もうとしないでください。

1 SMS_RECEIVEDブロードキャストは中止可能であると常に信じていました。しかし、 Android 4.4 APIサイト は別のことを言っています:「…新しいSMSがSMS_RECEIVED_ACTIONブロードキャストをリッスンして到着したとき、これは不可解な放送…」

26
Flow

修正しました。

最初の問題は、 私の質問のリビジョン2 でわかるように、実際にはintent-filter要素に属しているときに、priority属性をaction要素内に配置したことです。そのため、優先順位は機能しませんでした。

API 19をターゲットにしながら、ハングアウトSMSを有効にして、優先順位を変えていくつかの経験をしました。

  • 優先度が設定されていません→BroadcastReceiverがSMS_RECEIVEDインテントを受信しません
  • 優先度500→BroadcastReceiverSMS_RECEIVEDインテントを受信します
  • 優先度9991 →BroadcastReceiverSMS_RECEIVEDインテントを受信します

したがって、ハングアウトSMSを有効にしてインテントを取得するには、優先度の最小値が必要なようです。わざわざ最小値を二等分する必要はありませんでした。;)私のアプリは受信したSMSを簡単にチェックし、それ以上処理しないため、999で低くなる理由はありません。しかし、放送は中止できないので、それは本当に違いを生むはずです。

1最大値

12
Flow

最新のGoogleハングアウトマニフェストによると、優先度が「3」に設定されたAbortSmsReceiverがあるため、API 18以下でSMS_RECEIVEDブロードキャストを受信するアプリは、3より高い優先度を使用する必要があるようです。

<receiver Android:name="com.google.Android.apps.babel.sms.AbortSmsReceiver" Android:permission="Android.permission.BROADCAST_SMS" Android:enabled="false">
    <intent-filter Android:priority="3">
        <action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

API 19のビルドターゲットを使用できます。デバイス上のアプリ実行中 API 19(KitKat)は、以前のAPIのようにブロードキャストを中止できません。これにより、アプリが早期アボートを実行するのを防ぎます。

ストックメッセージングアプリが重複した通知を投稿するのを防ぐために、この中止が含まれていると思います。ストックメッセージングアプリは、KitKatより前に優先度0で処理する必要がありますが、優先度を設定しないアプリケーションも0で処理されます。 IntentFilterオブジェクトは、デフォルトの優先度値「0」で作成されます。

public IntentFilter() {
        mPriority = 0;
        mActions = new ArrayList<String>();
}
3
Jim

私はまだ放送をうまく得ることができます。新しいハングアウトをインストールしてSMSを有効にしました。私の場合、SMSの内容を読んでいるだけで、それは引き続き機能します。ただし、私が行ったことは、 前の後にインテントフィルターの優先度を999に設定することでした。ここにスレッド

<intent-filter Android:priority="999" >
   <action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>

多分それは役割を果たしていますか?

更新:ターゲットをSDKレベル19に変更したことを読んでください。その場合、API 19のガイドラインに従ってアプリの動作を変更する必要があることを読みました(リンクが見つかりません)。ターゲットを18に戻すと、問題なく動作するはずです。

2
Ricardo

私は同じ問題を抱えています。 SDK 17をターゲットにしていますが、ハングアウトでSMSの処理が有効になっていると、ブロードキャストを取得できません。ハングアウトが市場で壊れたアプリケーションの数を誰が知っていますか。

優先度を微調整して、それが役立つかどうかを確認します。

[編集]うん、優先順位はターゲットSDK 17で私のためにそれを修正しました。ありがとう!

0
Neil MacMillan