1

Я только что начал свой первый основной проект - простое антикражное приложение, которое, когда мой телефон был текстовым, если он содержит определенную строку, он будет отправьте sms обратно на исходный адрес, указав местоположение телефона. Тем не менее, я на данный момент пытаюсь только получить телефон, чтобы получить sms, проверить, содержит ли он строку, получить местоположение, а затем тост местоположение на телефоне. Моя проблема в том, что я очень новичок в программировании на Android/Java (только 15). У меня возникают проблемы с передачей моего местоположения из моего MainActivity в мой широковещательный приемник.Как использовать намерения для передачи данных из Activity to BroadcastReceiver

Это моя MainActivity - где мой LocationListener, как вы можете видеть, я прокомментировал Toast.makeText() в onLocationChanged, если я его не комментирую, я получаю правильные координаты.

package com.SMS; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 

public class MainActivity extends Activity 
{ 

    private LocationManager lm; 
    private LocationListener locationListener; 


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

     lm = (LocationManager) 
      getSystemService(Context.LOCATION_SERVICE); 

     locationListener = new MyLocationListener(); 

     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);  
    } 

public class MyLocationListener implements LocationListener 
{ 
    @Override 
    public void onLocationChanged(Location loc) { 
      if (loc != null) 
      { 
       int Longitude = (int) (loc.getLongitude() * 1E6); 
       int Latitude = (int) (loc.getLatitude() * 1E6); 
       // Toast.makeText(getBaseContext(), "Location Changed : Lat: " + Latitude + " Longitude : " + Longitude, Toast.LENGTH_LONG).show();     sendBroadcast(intent); 

       Intent intent = new Intent(MainActivity.this, SMSReceiver.class); 
       intent.putExtra("Longitude", Longitude); 
       intent.putExtra("Latitude", Latitude); 
       sendBroadcast(intent); 
      } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 
    } 
} 

Это мой класс SmsReceiver, это где смс извлекается для проверки содержащей строки. Я пробовал все, что я видел на таких вещах (моя история полна этого материала), но что бы я ни делал, широта и долгота все равно возвращаются 300 - значение по умолчанию, которое я установил. Я уверен, что это как-то связано с моей установкой намерения и получением намерения, просто не знаю, что это такое, что неправильно. Поэтому, пожалуйста, прочитайте и дайте мне отзыв о чем-нибудь, с чем вы не ошибетесь.

package com.SMS; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 
import android.widget.Toast; 

public class SMSReceiver extends BroadcastReceiver 
{ 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 

     //--get the sms message passed in-- 
     Bundle bundle = intent.getExtras(); 
     SmsMessage[] msgs = null; 
     String str = ""; 
     if (bundle != null) 
     { 
      //--- retrieve the sms message received 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessage[pdus.length]; 
      for (int i=0; i<msgs.length; i++) 
      { 
       msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 

       str += "SMS from " + msgs[i].getOriginatingAddress(); 
       str += " : "; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n"; 
       if(str.contains("hi")) 
       { 
        int longitude = intent.getIntExtra("Longitude", 300); 
        int latitude = intent.getIntExtra("Latitude", 300); 
        //--display the new sms message 
        Toast.makeText(context, "Location Changed : Lat: " + latitude + " Longitude : " + longitude, Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 
    } 
} 

И, наконец, мой манифеста, по какой-то причине меня есть inckling, что это может быть частью моей проблемы, но я не знаю, почему - если вы видите что-то неправильно или неуместна, или может быть упрощена, пожалуйста, скажите мне

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.SMS" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.SMS.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <receiver android:name=".SMSReceiver" > 
      <intent-filter> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED" > 
        <action android:name=".com.SMS.Broadcast" > 
        </action> 
       </action> 
      </intent-filter> 
     </receiver> 
    </application> 

    <uses-permission android:name="android.permission.SEND_SMS" > 
    </uses-permission> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" > 
    </uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > 
    </uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" > 
    </uses-permission> 
    <uses-permission android:name="android.permission.INTERNET" > 
    </uses-permission> 
</manifest> 

Так что, если вы можете дать мне обратную связь о том, что это не так, и как изменить его, или есть какие-либо вопросы по этому поводу, пожалуйста, ответьте, потому что я проводил часы, только поиск в Интернете , Кроме того, если вы видите что-то плохое кодирование, пожалуйста, не стесняйтесь говорить мне правильно. Спасибо вам большое, если вы можете исправить эту проблему!

ответ

0

Одна из основных ошибок в коде здесь

Intent intent = new Intent(MainActivity.this, SMSReceiver.class); 
       intent.putExtra("Longitude", Longitude); 
       intent.putExtra("Latitude", Latitude); 
       sendBroadcast(intent); 

Вы отправляете намерение с широтой и долготой и в приемнике вы пытаетесь получить данные смс с умыслом. Если тот же приемник отвечает на получение sms, тогда в этом случае намерение содержит только данные sms и данные о долготе и широте. вы не можете получать обе данные с той же целью, что и из разных источников. используют разные трансляционные средства для обоих или для подключения через другой подход. Надеюсь, он очистится.

Смежные вопросы