0

J'ai créé un projet où l'application peut recevoir des sms. Cela s'est bien passé mais quand j'ai essayé de l'implémenter dans mon projet principal "ça ne marcherait pas, j'essaye d'implémenter le broadcastreceiver sur mon fragment." J'ai essayé google et différents forums la plupart d'entre eux ont dit que c'était les permissions, est déjà réglé :(. espère vraiment que je peux obtenir un peu de clarté dans ce domaine.Sms broadcastreceiver ne fonctionne pas dans mon fragment

Mon journal d'erreur dit cela.

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 [email protected] 
 
                     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) 

Mon manifeste Android

.

<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>

Mon 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); 
 

 
    } 
 
}

Merci à tous à l'avance!

+0

'NullPointerException à ... (ThirdFragment.java:75)' -.. Regardez la ligne 75 dans votre 'ThirdFragment' classe Ressemble' view' est nulle –

+0

je suppose que votre application reçoit SMS quand il est au premier plan, mais il soulève NPE quand il est hors de l'écran, n'est-ce pas? – nandsito

Répondre

0

La solution était que le code aurait dû être dans mon MainActivity.java. Je pense que broadcastreceiver seulement peut être "appelé de MainActivity et pas dans le fragment.java.J'ai mis le code sur mon onResume et cela a fonctionné: D. Mon textview (où le sms j'ai chargé) est dans le fragment xml fichier

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); 
 

 

 

 
    }