2017-05-09 12 views
0

私には問題があり、それが何を引き起こしているのではないかと思います。私の活動では、データはボタンをクリックするとサーバーに送信されます。ブロードキャスト受信機が電話で機能していない

サーバーはこの要求を処理し、USSDのプロンプトのように、電話番号で電話機のネットワークPROMPTを開始します。

ここで、プロンプトが表示された分が表示されます。ユーザーはオプションを選択し、ピンコードを入力して要求を完了する必要があります。サーバー上でこの要求が確認されると、私はFCMを使用してアプリに投稿します。メッセージングサービスがこのリクエストを受け取ると、現在のアクティビティにブロードキャストを送信します。

ブロードキャストは自分のアクティビティで受信されます。このアクティビティは、ユーザーに最終的なアクティビティを行うよう通知します。

これは私のエミュレータでは完全に動作しますが、私の電話機では動作しません。私は自分のログをチェックして、受信者が電話で呼ばれていないことに気づき、理由を知らない。プロンプトが表示されたときに、アプリがフォーカスを失うなどの何かがあったような気がします。私はあまりよく分からない。

編集:

MyFireBaseMessagingService.java:

public void onMessageReceived(RemoteMessage remoteMessage) { 
    // Check if message contains a data payload. 
    if (remoteMessage.getData().size() > 0) { 
     Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
    } 

    Map<String, String> data = remoteMessage.getData(); 
    if (data.containsKey("method") && data.containsKey("action")) { 
     String action = data.get("action"); 
     switch (action) { 
      case "/checkout": 
       Log.d("onMessageReceived", data.toString()); 
       Intent i = new Intent(); 
       i.setAction("com.xxxxxx.xxxxxx.CHECKOUT"); 
       i.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
       i.putExtra("data", new JSONObject(data).toString()); 
       sendBroadcast(i); 
       break; 
      default: 
       Log.d("Default", action); 
       break; 
     } 
    } 

    // Check if message contains a notification payload. 
    if (remoteMessage.getNotification() != null) { 
     Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); 
    } 

    // Also if you intend on generating your own notifications as a result of a received FCM 
    // message, here is where that should be initiated. See sendNotification method below. 
} 

MyBroadcastReceiver.java:

private class MyBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     showProgress(false); 
     Intent checkoutIntent = new Intent(PaymentActivity.this, CheckoutActivity.class); 
     startActivity(checkoutIntent); 
    } 
} 

MyActivity.java:

@Override 
public void onResume() { 
    super.onResume(); 
    IntentFilter filter = new IntentFilter("com.xxxxxx.xxxxxx.CHECKOUT"); 
    filter.setPriority(999); 
    mBroadcastReceiver = new MyBroadcastReceiver(); 
    mContext.registerReceiver(mBroadcastReceiver, filter); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    mContext.unregisterReceiver(mBroadcastReceiver); 
} 
+0

あなたは、放送受信機の部分まで、あなたの携帯電話ですべて正常に動作していると言っていますか?受信機をどのように実装したかを示すことができますか?いくつかのコードはいつも見てよかった –

+0

はい、それは私が言っていることです、私は私のコンソールにエラーが表示されない、自分の投稿を編集し、コードを追加します。 – user3718908

+0

私の投稿を編集したので、コードを今すぐチェックすることができます。ありがとう。 – user3718908

答えて

0

あなたが試すことができるものは次のとおりです。放送registerReceiveronResumeunregisterReceiverからonPause()に削除します。

次に、新しいクラスを追加します。

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent checkoutIntent = new Intent(context, CheckoutActivity.class); 
     context.startActivity(checkoutIntent); 
    } 
} 

は、マニフェストにこれを追加(とアクションを変更してください):

<receiver 
    android:name=".MyReceiver" 
    android:enabled="true" 
    android:exported="false"> 
    <intent-filter> 
     <action android:name="com.xxxxxx.xxxxxx.CHECKOUT" /> 
    </intent-filter> 
</receiver> 

を今してみてください。
このようにして、アクティビティのonPause()が呼び出されても、onReceive()BroadcastReceiverに呼び出されます。

+0

この方法で試してみましたが、うまくいきませんでした。同じ振る舞い。 – user3718908

0

「これは私のエミュレータでは完全に機能しますが、電話機ではうまく動作しません」。私はあなたにアンドロイドの許可が必要だと思う。

+0

https://developer.android.com/training/permissions/requesting.html – Dungnbhut

+0

私は理解していません。すでにマニフェストファイルに権限を追加しましたが、どのような権限がありませんか?私はあなたを得ない。 – user3718908

+0

私はあなたのアプリがいくつかの電話情報を使用し、登録の許可を得ていないと思います。 http://stackoverflow.com/questions/33036523/broadcast-receivers-not-working-in-android-6-0-marshmallow – Dungnbhut

関連する問題