0

「電話を探す」アプリケーションに似た何かを達成しようとしています。つまり、SMS を自分の電話に送信し、電話がどこにあるかを知らせる SMS で返信を受け取ります。このアプリケーションの要件は、オープン ソースであることです。

この種のアプリケーションは F-Droid リポジトリに既に存在し、FindMyPhone と呼ばれています。ただし、電話がSMSを受信すると、その返信は連絡先への返信としてストックメッセージングアプリに表示されるだけで、効果的に送信されません. これは予期された動作ではなく、コード リポジトリで、作成者がこれを修正しようとしたが、2013 年に断念したことがわかりました。

コードを調べたところ、使用する手法が単純であることがわかりました。

                try {
                SmsManager smsManager = SmsManager.getDefault();
                // ********* SENDING SMS HERE *******
                smsManager.sendTextMessage(currentFromAddress, null, txt, null, null);
                // ********* SENDING SMS HERE *******
                Log.d(FindMyPhoneHelper.LOG_TAG, "Sent SMS");
                Thread.sleep(5000);
                Log.d(FindMyPhoneHelper.LOG_TAG, "Slept 5000ms");
            } catch(Exception e) {
                Log.d(FindMyPhoneHelper.LOG_TAG, "Failed SMS: " + e.getMessage());
                e.printStackTrace();
            }

(sourceforge のコードへのリンク)

このコードは、サービスによって新しいスレッド内で呼び出される LocationListener を実装するクラスで実行されます。

この動作の理由についてのヒントはありますか? メッセージが表示されるだけで送信されないのはなぜですか? 私は別の同様のアプリケーションを見てきました: https://f-droid.org/repository/browse/?fdid=com.teamdc.stephendiniz.autoaway

これは正常に機能しており、SMS への応答は期待どおりです。主な違いは、このアプリが新しいメッセージを継続的にリッスンするサービスで実行され、マニフェストで宣言するのではなく、その場で受信者を登録することです。私にとってこれは大したことではありませんが、サービスを常に実行したくないのです。

これについて何か助けてくれてありがとう。

4

2 に答える 2

0

SMS の送信に失敗する理由の 1 つは、次のように、アプリが SMS サービス センターとして null を sendTextMessage に渡しているにもかかわらず、SMS プロバイダーから null を取得していることが原因である可能性があります。

    public static String getSmsServiceCenterForConversation(final DatabaseWrapper dbWrapper,
        final String conversationId) {
    Assert.isNotMainThread();
    Cursor cursor = null;
    try {
        cursor = dbWrapper.query(DatabaseHelper.CONVERSATIONS_TABLE,
                new String[] { ConversationColumns.SMS_SERVICE_CENTER },
                ConversationColumns._ID + "=?",
                new String[] { conversationId },
                null, null, null);
        Assert.inRange(cursor.getCount(), 0, 1);
        if (cursor.moveToFirst()) {
            return cursor.getString(0);
        }
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
    return null;
}

参照: https://android.googlesource.com/platform/packages/apps/Messaging/+/master/src/com/android/messaging/datamodel/BugleDatabaseOperations.java#917

マニフェストで SMS_RECEIVED をリッスンするブロードキャスト レシーバーを登録する必要があります。オンザフライでレシーバーを登録する必要はありません。ただし、onReceive で費やす実行時間を短くする必要があるため、レシーバーは IntentService などのサービスに作業をオフロードする必要があります。

于 2015-12-27T22:57:49.530 に答える
0

問題が何であるかがわかりました。メッセージング API とは何の関係もありません。

SMSの着信に反応するBroadcastReceiverでは、送信者の電話番号がServiceに渡され、実際にこのようなIntentデータでSMSを返信する

locationIntent.setData(Uri.parse("?destinationAddress=" + from));

「差出人」アドレスは URI エンコードされていたため、国際プレフィックスの + (プラス) 文字が失われていました。メッセージング アプリはそれを受け入れることができたので、メッセージを表示することはできましたが、これは送信されませんでした。

Data の代わりに Intent Extras を使用すると、電話番号がエンコーディングを通過しないため、うまくいきました。

ではごきげんよう

于 2015-12-30T12:38:40.680 に答える