2016-05-22 57 views
0

我正在構建一個android應用程序,並且我想向當前用戶發送一條短信,然後使用BroadcastReceiver讀取此短信的內容。目前短信已成功發送,但我的BroadcastReceiver無法正常工作。 我沒有把正確的權限的manifest.xml:發送短信給自己並接收它

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

這裏是我的片段代碼:

public class GetOtpFragment extends Fragment { 

    private SMSReceiver mSMSreceiver; 
    private VerificationActivity mActivity; 
    private EditText mPhoneNumber; 
    private Button mVerifyButton; 

    public GetOtpFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mActivity = (VerificationActivity) getActivity(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_get_otp, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     Bundle b = getArguments(); 
     mPhoneNumber = (EditText) view.findViewById(R.id.phone_number); 
     mVerifyButton = (Button) view.findViewById(R.id.verify_phone_number_button); 

     // I register my receiver 
     IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 
     mSMSreceiver = new SMSReceiver(); 
     mActivity.registerReceiver(mSMSreceiver, intentFilter); 

     // verify phone number 
     mVerifyButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // this works 
       SmsManager sms = SmsManager.getDefault(); 
       sms.sendTextMessage(mPhoneNumber.getText().toString(), null, "test", null, null); 
      } 
     }); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     mActivity.unregisterReceiver(mSMSreceiver); 
    } 
} 

我的廣播接收器:

public class SMSReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // never called 
     Toast.makeText(context, "SMS received", Toast.LENGTH_LONG); 
     Log.d("---- smsreceiver ---", "in smsreceiver"); 

    } 
} 

所以就像我說的,短信真的發送,我可以在短信應用程序中找到它,但沒有通知。事情是我的接收器從來沒有被叫過,沒有日誌,也沒有烤麪包,我不知道爲什麼。是否因爲sendTextMessage未創建任何通知?

+0

「是否因爲sendTextMessage'不會產生任何通知?」 - 沒有任何'SmsManager'的方法創建'Notification's。應用程序本身負責發佈這些內容。如果你沒有在你的短信應用中禁用它們,你至少應該爲傳入的消息得到一個「通知」。你確定你有合適的號碼嗎?你能成功地發送自己的短信應用程序的消息嗎?您是否在短信應用中看到了傳出消息或傳入消息? Android的哪個版本以及您測試的是哪種設備? –

+0

現在我正在使用android studio的虛擬設備。所以是的,當我發送消息時,沒有通知傳入的消息。但是當我進入短信應用程序後,消息真的在這裏。事情是我的BroadcastReceiver不會捕獲與'sendTextMessage'發送的短信,但抓住其他短信,我不明白。 – pchmn

+0

如果您在短信應用程序中看到傳出的消息,那麼它正在發送,並且您正在API 4.4或更高版本上運行,因此無法中止「SMS_RECEIVED」廣播。這一點以及您沒有收到傳入消息或「通知」的事實很可能意味着您沒有發送到模擬器的正確編號。但我不確定模擬器是如何處理的,因爲我只在實際設備上測試短信。如果您的Receiver爲其他傳入消息工作,那麼我會說你可能沒問題。你可以在真實設備上測試發送給自己嗎? –

回答

-1

嘗試註冊清單上的意圖,而不是通過編程註冊,看看你是否能夠接收廣播。

<receiver 
    android:name="com.example.SMSReceiver" 
    android:permission="android.permission.BROADCAST_SMS"> 
    <intent-filter> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
    </intent-filter> 
</receiver> 

如果不工作,可能是因爲您之前做一些其他的應用程序捕獲廣播,並消耗它(爲SMS_RECEIVED廣播是一個有序的廣播),如果是這樣的情況下,嘗試加入android:priority="2147483000"到意圖過濾器,像這樣:

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

如果沒有工作,你可能有一個問題與registerReceiver,確保你的活動保持住,直到短信收了回來。

+0

感謝您的回覆。我試圖像你所說的那樣在接收器中註冊接收器,但它不起作用。優先也沒有效果。爲什麼啊? – pchmn