2016-03-08 20 views
0

我的應用程序有一個Log活動,用戶輸入手機號碼。他可以使用按鈕(「ENVIAR」)將代碼「1234020」發送到該號碼,並使用內容和傳入消息的編號更改TextView。在輔助活動中使用廣播後Android崩潰

使用按鈕「SIGUIENTE」,應用程序必須轉到第二個活動LucesAlarma。在那裏,他們用第一個活動的電話號碼修改TextView併發送(使用「ENVIARLA」按鈕)並接收消息。

按鈕「Atras」應該返回到第一個活動。問題是在按下MainActivity中的「Siguiente」按鈕後,應用程序崩潰。我相信Manifest中存在一個問題。

主要活動:

public class MainActivity extends AppCompatActivity { 
    Button ENVIAR,SIGUIENTE; 
    EditText NUMEROT; 
    TextView CONTENIDO; 
    IntentFilter intentFilter; 

    private BroadcastReceiver intentReciever = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      String MENSAJE = intent.getExtras().getString("mensaje"); 
      String NUMERODELMENSAJE = intent.getExtras().getString("numero"); 
      CONTENIDO=(TextView)findViewById(R.id.tvSMScontenido); 
      CONTENIDO.setText(MENSAJE+NUMERODELMENSAJE); 
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     intentFilter = new IntentFilter(); 
     intentFilter.addAction("SMS_RECEIVED_ACTION"); 

     ENVIAR  = (Button) findViewById(R.id.bEnviarMA); 
     SIGUIENTE = (Button)findViewById(R.id.bSiguienteMA); 
     NUMEROT = (EditText)findViewById(R.id.etNumeroTelf); 
     ENVIAR.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String ELMENSAJE = "1234020"; 
       String ELNUMERO = NUMEROT.getText().toString(); 
       EnviarSMS(ELMENSAJE, ELNUMERO); 
       Toast.makeText(getApplicationContext(), "Ya esta ya", Toast.LENGTH_LONG).show(); 
      } 
     }); 

     SIGUIENTE.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intento = new Intent(MainActivity.this, LucesAlarma.class); 
       intento.putExtra("numero", NUMEROT.getText().toString()); 
       startActivity(intento); 
      } 
     }); 
    } 

    @Override 
    protected void onResume() { 
     registerReceiver(intentReciever, intentFilter); 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     unregisterReceiver(intentReciever); 
     super.onPause(); 
    } 

    protected void EnviarSMS(String elmensaje, String elnumero) { 

     SmsManager SMS = SmsManager.getDefault(); 
     SMS.sendTextMessage(elnumero, null, elmensaje, null, null); 
    } 
} 

次活動(LucesAlarma)

public class LucesAlarma extends AppCompatActivity { 
    TextView NUMEROLA,MENSAJELA; 
    Button ENVIARLA,ATRAS; 
    IntentFilter intentFilterLA; 

    private BroadcastReceiver intentRecieverLA = new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context context, Intent intent){ 

      String MENSAJE = intent.getExtras().getString("mensaje"); 
      String NUMERODELMENSAJE = intent.getExtras().getString("numero"); 
      MENSAJELA=(TextView)findViewById(R.id.tvMensajeLA); 
      MENSAJELA.setText(MENSAJE+NUMERODELMENSAJE); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_luces_alarma); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     Intent intent = getIntent(); 
     final String numeropos =intent.getStringExtra("numero"); 
     NUMEROLA=(TextView)findViewById(R.id.tvNumeroLA); 
     NUMEROLA.setText(numeropos); 

     ENVIARLA=(Button)findViewById(R.id.bEnviarLA); 
     ENVIARLA.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String ELMENSAJE = "1234020"; 
       String ELNUMERO = numeropos; 
       EnviarSMS(ELMENSAJE, ELNUMERO); 
       Toast.makeText(getApplicationContext(), "Enviado", Toast.LENGTH_LONG).show(); 
      } 
     }); 

     ATRAS=(Button)findViewById(R.id.bAtras); 
     ATRAS.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intentoLA = new Intent(LucesAlarma.this, MainActivity.class); 
       startActivity(intentoLA); 
      } 
     }); 

    } 

    @Override 
    protected void onResume() { 
     registerReceiver(intentRecieverLA,intentFilterLA); 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     unregisterReceiver(intentRecieverLA); 
     super.onPause(); 
    } 

    protected void EnviarSMS(String elmensaje, String elnumero) { 

     SmsManager SMS = SmsManager.getDefault(); 
     SMS.sendTextMessage(elnumero, null, elmensaje, null, null); 
    } 
} 

短信Reciver java類:

public class ReceptorSMS extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle bundle = intent.getExtras(); 
     SmsMessage[]messages=null; 
     String str = ""; 
     String num = ""; 
     String men = ""; 
     if(bundle != null) { 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      assert pdus != null; 
      messages = new SmsMessage[pdus.length]; 
      for (int i=0 ; i<messages.length;i++) { 
       messages[i]=SmsMessage.createFromPdu((byte[])pdus[i]); 
       num = messages[i].getDisplayOriginatingAddress(); 
       str += "Mensaje de" +messages[i].getOriginatingAddress(); 
       str += ":"; 
       str += messages[i].getMessageBody(); 
       str += "\n"; 
       men = messages[i].getMessageBody(); 
      } 
      //   Toast.makeText(context,str,Toast.LENGTH_SHORT).show(); 
      Intent broadcastIntent = new Intent(); 
      broadcastIntent.setAction("SMS_RECEIVED_ACTION"); 
      broadcastIntent.putExtra("sms", str); 
      broadcastIntent.putExtra("mensaje", men); 
      broadcastIntent.putExtra("numero", num); 
      context.sendBroadcast(broadcastIntent); 
     } 
    } 
} 

而且清單,我不能確定問題: 'v

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.josue.smartwasip"> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <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.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".LucesAlarma" 
      android:label="@string/title_activity_luces_alarma" 
      android:theme="@style/AppTheme.NoActionBar"> 

      <intent-filter> 
       <action android:name="com.example.josue.smartwasi" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 

     </activity> 
     <receiver android:name=".ReceptorSMS"> 
      <intent-filter> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

這裏是exption:

03-08 15:39:15.059 1385-1385/com.example.josue.smartwasip E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.josue.smartwasip, PID: 1385 
    java.lang.RuntimeException: Unable to resume activity {com.example.josue.smartwasip/com.example.josue.smartwasip.LucesAlarma}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.IntentFilter.writeToParcel(android.os.Parcel, int)' on a null object reference 
     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103) 
     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481) 
     at android.app.ActivityThread.-wrap11(ActivityThread.java) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.IntentFilter.writeToParcel(android.os.Parcel, int)' on a null object reference 
     at android.app.ActivityManagerProxy.registerReceiver(ActivityManagerNative.java:3008) 
     at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1184) 
     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1152) 
     at android.app.ContextImpl.registerReceiver(ContextImpl.java:1146) 
     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:554) 
     at com.example.josue.smartwasip.LucesAlarma.onResume(LucesAlarma.java:76) 
     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258) 
     at android.app.Activity.performResume(Activity.java:6312) 
     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092) 
     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)  
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)  
     at android.app.ActivityThread.-wrap11(ActivityThread.java)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:148)  
     at android.app.ActivityThread.main(ActivityThread.java:5417)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

回答

2

你永遠只能在LucesAlarma宣佈IntentFilter intentFilterLA;。您還需要爲其分配一個值,就像您在MainActivity.onCreate()中爲IntentFilter那樣分配值。

這兩行添加到LucesAlarma.onCreate()

intentFilterLA = new IntentFilter(); 
intentFilterLA.addAction("SMS_RECEIVED_ACTION"); 
+0

它的工作原理!!!!,TY –

+0

不客氣。 –