2016-07-02 7 views
1

Ich möchte phoneNo im Rahmen meiner onReceive Methode erkannt werden. Was muss ich tun ? Ich dachte, es so zu erklären würde es tun, aber keine Freude:Warum wird meine Zeichenfolge in meinem Broadcast-Empfänger nicht erkannt - SMS-Code senden

public class MainActivity extends Activity { 
    Button sendBtn; 
    EditText txtphoneNo; 
    String phoneNo; 

// register a broadcast receiver 
    private BroadcastReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     sendBtn = (Button) findViewById(R.id.btnSendSMS); 
     txtphoneNo = (EditText) findViewById(R.id.editText); 
     phoneNo = txtphoneNo.getText().toString(); etc etc.... 

Derzeit mein Code sieht aus wie unten. Wenn der Rundfunkempfänger erkennt eine empfangene SMS I logcat drucken möchten:

 System.out.println(origNumber); 
     System.out.println(phoneNo); 

Aber ich kann nicht phoneNo in der gesamten Tätigkeit anerkannt machen, nur im Rahmen von sendSMSmessage.

public class MainActivity extends Activity { 
    Button sendBtn; 
    EditText txtphoneNo; 
    EditText txtMessage; 

// register a broadcast receiver 
    private BroadcastReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     sendBtn = (Button) findViewById(R.id.btnSendSMS); 
     txtphoneNo = (EditText) findViewById(R.id.editText); 
     txtMessage = (EditText) findViewById(R.id.editText2); 

     sendBtn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       sendSMSMessage(); 
      } 
     }); 

     IntentFilter filter = new IntentFilter(); 
//  the thing we're looking out for is received SMSs 
     filter.addAction("android.provider.Telephony.SMS_RECEIVED"); 

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

      { 
       //do something based on the intent's action 

       Bundle extras = intent.getExtras(); 

       if (extras == null) 
        return; 

       Object[] pdus = (Object[]) extras.get("pdus"); 
       SmsMessage msg = SmsMessage.createFromPdu((byte[]) pdus[0]); 
       String origNumber = msg.getOriginatingAddress(); 

       System.out.println(origNumber); 
//    I want to print phoneNo here!!!! 
//    System.out.println(phoneNo); 

      } 
     }; 
     registerReceiver(receiver, filter); 
    } 



    protected void sendSMSMessage() { 
     Log.i("Send SMS", ""); 
     String phoneNo = txtphoneNo.getText().toString(); 
     String message = txtMessage.getText().toString(); 

     try { 
      SmsManager smsManager = SmsManager.getDefault(); 
      smsManager.sendTextMessage(phoneNo, null, message, null, null); 
      Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show(); 
     } 

     catch (Exception e) { 
      Toast.makeText(getApplicationContext(), "SMS faild, please try again.", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     if (receiver != null) { 
      unregisterReceiver(receiver); 
      receiver = null; 
     } 
     super.onDestroy(); 
    } 

} 

Antwort

1

Das Problem ist, dass Sie phoneNo als lokale Variable von sendSMSMessage() sind zu erklären, so ist es nicht zugänglich außerhalb dieses Verfahrens.

Sie sollten es stattdessen als Instanzvariable deklarieren.

Etwas wie folgt aus:

public class MainActivity extends Activity { 
    Button sendBtn; 
    EditText txtphoneNo; 
    EditText txtMessage; 

    String phoneNo; 

    private BroadcastReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     sendBtn = (Button) findViewById(R.id.btnSendSMS); 
     txtphoneNo = (EditText) findViewById(R.id.editText); 
     txtMessage = (EditText) findViewById(R.id.editText2); 

     sendBtn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       sendSMSMessage(); 
      } 
     }); 

     IntentFilter filter = new IntentFilter(); 
//  the thing we're looking out for is received SMSs 
     filter.addAction("android.provider.Telephony.SMS_RECEIVED"); 

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

      { 
       Bundle extras = intent.getExtras(); 

       if (extras == null) 
        return; 

       Object[] pdus = (Object[]) extras.get("pdus"); 
       SmsMessage msg = SmsMessage.createFromPdu((byte[]) pdus[0]); 
       String origNumber = msg.getOriginatingAddress(); 

       System.out.println(origNumber); 
       if(phoneNo != null) { 
        System.out.println(phoneNo); 
       } 

      } 
     }; 
     registerReceiver(receiver, filter); 
    } 



    protected void sendSMSMessage() { 
     Log.i("Send SMS", ""); 
     phoneNo = txtphoneNo.getText().toString(); 
     String message = txtMessage.getText().toString(); 

     try { 
      SmsManager smsManager = SmsManager.getDefault(); 
      smsManager.sendTextMessage(phoneNo, null, message, null, null); 
      Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show(); 
     } 

     catch (Exception e) { 
      Toast.makeText(getApplicationContext(), "SMS faild, please try again.", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     if (receiver != null) { 
      unregisterReceiver(receiver); 
      receiver = null; 
     } 
     super.onDestroy(); 
    } 
} 
+0

Ha. Ich dachte, ich hätte es so versucht. In jedem Fall, kopieren und fügen Sie Ihren Code und jetzt scheint es gut zu funktionieren. – CHarris