简体   繁体   中英

Sms broadcastreceiver isn't working in my fragment

I created a project where the app can receive sms. It went well but when i tried to implement it to my Main project" it wouldn't work. I'm trying to implement the broadcastreceiver to my fragment. I tried google and different forums most of them said it was the permissions, but mine is already set :(. Really hope i can get some clarity in this.

My error log says this.

 FATAL EXCEPTION: main Process: c.timno.smsgsm20, PID: 23636 java.lang.RuntimeException: Error receiving broadcast Intent { act=android.provider.Telephony.SMS_RECEIVED flg=0x8000010 (has extras) } in c.timno.smsgsm20.ThirdFragment$1@423ff210 at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:788) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at c.timno.smsgsm20.ThirdFragment.processReceive(ThirdFragment.java:75) at c.timno.smsgsm20.ThirdFragment$1.onReceive(ThirdFragment.java:55) at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:778) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604) at dalvik.system.NativeStart.main(Native Method) 

My android manifest.

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="c.timno.smsgsm20"> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_SMS" /> <application android:allowBackup="true" android:icon="@mipmap/ic_heicon" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".Splash" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"/> </activity> <!-- ATTENTION: This was auto-generated to add Google Play services to your project for App Indexing. See https://g.co/AppIndexing/AndroidStudio for more information. --> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <activity android:name=".SettingsActivity" android:label="@string/title_activity_settings"></activity> </application> </manifest> 

My fragment

 package c.timno.smsgsm20; import android.app.Fragment; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.telephony.SmsManager; import android.telephony.SmsMessage; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; /** * Created by TimNo on 2016-09-09. */ public class ThirdFragment extends Fragment{ private View view ; View myView; BroadcastReceiver receiver=null; @SuppressWarnings("ResourceType") @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.third_layout, container, false); return inflater.inflate(R.layout.third_layout, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { view = getActivity().findViewById(R.id.content_frame); IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); receiver = new BroadcastReceiver() { @Override public void onReceive(Context arr0, Intent arr1) { processReceive (arr0, arr1); } }; getActivity().registerReceiver(receiver,filter); } public void onDestroy() { super.onDestroy(); getActivity().unregisterReceiver(receiver); } public void processReceive (Context context, Intent intent){ Toast.makeText(context, "You got a message",Toast.LENGTH_LONG).show(); TextView lbs = (TextView)view.findViewById(R.id.textvview); Bundle bundle = intent.getExtras(); Object[] objArr= (Object[])bundle.get("pdus"); String sms =""; for (int i=0;i<objArr.length;i++){ SmsMessage smsMsg = SmsMessage.createFromPdu((byte[])objArr[i]); String smsBody = smsMsg.getMessageBody(); String senderNumber = smsMsg.getDisplayOriginatingAddress(); sms +="From: " + senderNumber+"\\nContent: "+smsBody+"\\n"; } lbs.setText(sms); } } 

Thank you all in advance!

The solution was that the code should have been in my MainActivity.java . I think broadcastreceiver only can be "called from MainActivity and not in the fragment.java. I put the code on my onResume and it worked :D. My textview (where the sms i loaded) is in the fragments xml file.

 BroadcastReceiver receiver=null; @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); receiver = new BroadcastReceiver() { @Override public void onReceive(Context arr0, Intent arr1) { processReceive (arr0, arr1); } }; registerReceiver(receiver,filter); } public void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } public void processReceive (Context context, Intent intent){ Toast.makeText(context, "You got a message",Toast.LENGTH_LONG).show(); TextView lbs = (TextView)findViewById(R.id.textvviewtsmsruta); Bundle bundle = intent.getExtras(); Object[] objArr= (Object[])bundle.get("pdus"); String sms =""; for (int i=0;i<objArr.length;i++){ SmsMessage smsMsg = SmsMessage.createFromPdu((byte[])objArr[i]); String smsBody = smsMsg.getMessageBody(); String senderNumber = smsMsg.getDisplayOriginatingAddress(); sms +="From: " + senderNumber+"\\nContent: "+smsBody+"\\n"; } lbs.setText(sms); } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM