Как извлечь данные из полученного sms и использовать их в другом действии?

#android #sms

#Android #sms

Вопрос:

У меня есть приложение, которое требует извлечения данных из полученного сообщения, а затем передачи этих данных в другое действие для других целей.Я извлек данные из полученного sms, но как я могу передать это из текущего файла Java, чтобы использовать его в другом файле Java?

 public class ReceivelocationActivity extends BroadcastReceiver   {

private LocationManager hdLocMgr;
private String hdLocProvider;

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

    Intent m=new Intent(context, ReceivelocationActivity.class);    
      PendingIntent pi=PendingIntent.getBroadcast(context, 0, m, 0); 
    Bundle bundle = intent.getExtras();        
    SmsMessage[] msgs = null;
    String str = ""; 
    String str2="";
    String str3="";
    String autoReplyToken = "Request_Accepted";
    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();                     
            str2=msgs[i].getOriginatingAddress();
            str  = " :";
            str  = msgs[i].getMessageBody().toString();
         str3=msgs[i].getMessageBody().toString();
            str  = "n";        
        }
        //---display the new SMS message---
        Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
      //  int number=Integer.parseInt(str2);

     // retrieve th current location
        Criteria hdCrit = new Criteria();
        hdCrit.setAccuracy(Criteria.ACCURACY_COARSE);
        hdCrit.setAltitudeRequired(false);
        hdCrit.setBearingRequired(false);
        hdCrit.setCostAllowed(true);
        hdCrit.setPowerRequirement(Criteria.POWER_LOW);

        hdLocMgr = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        hdLocProvider = hdLocMgr.getBestProvider(hdCrit, true); 

        Location location = hdLocMgr.getLastKnownLocation(hdLocProvider);

        Double dlat = location.getLatitude();
        Double dlon = location.getLongitude();


        String mymsg = Double.toString(dlat)   " "  Double.toString(dlon) ; 

        boolean isAutoReply = str3.startsWith(autoReplyToken);

        if (!isAutoReply) {
            SmsManager sms = SmsManager.getDefault();
            String autoReplyText = autoReplyToken   " " mymsg;
            sms.sendTextMessage(str2, null, autoReplyText, pi, null);
        }

      /* Part as suggested by you to pass a string to friendlocation.class  */  
        Intent in = new Intent(context, Friendlocation.class);
        in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        in.putExtra("latlongstring", str3);
        context.startActivity(in);
    }                 
}



    public class Friendlocation extends MapActivity implements LocationListener {
     /** Called when the activity is first created. */
private static final String TAG = "LocationActivity";
LocationManager locationManager; 
  Geocoder geocoder; 
  TextView locationText;
  MapView map;  
  MapController mapController; 
  GeoPoint point;

  class MapOverlay extends com.google.android.maps.Overlay
    {
        @Override
        public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long   when) 
        {
            super.draw(canvas, mapView, shadow);                   

            //---translate the GeoPoint to screen pixels---
            Point screenPts = new Point();
            mapView.getProjection().toPixels(point, screenPts);

            //---add the marker---
            Bitmap bmp = BitmapFactory.decodeResource(
                getResources(), R.drawable.androidmarker);            
            canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);         
            return true;
        }
    } 


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main4);



    locationText = (TextView)this.findViewById(R.id.lblLocationInfo);
    map = (MapView)this.findViewById(R.id.mapview);
    map.setBuiltInZoomControls(true);

    mapController = map.getController(); 
    mapController.setZoom(16);


    String latlon = getIntent().getStringExtra("latlongstring");
    this.friendlocation(latlon);

}



public void friendlocation(String latlon) { 

    String [] location = latlon.split("\s ");
    double alt=0;
    double bear=0;
    double lat= Double.valueOf(location[0].trim()).doubleValue();
    double lon=Double.valueOf(location[1].trim()).doubleValue();

  String text = String.format("Lat:t %fnLong:t %fnAlt:t %fnBearing:t %f", lat, 
                lon, alt,bear);
  this.locationText.setText(text);

  try {
    List<Address> addresses = geocoder.getFromLocation(lat, lon,10); //<10>
    for (Address address : addresses) {
      this.locationText.append("n"   address.getAddressLine(0));
    }

    int latitude = (int)(lat * 1000000);
    int longitude = (int)(lon * 1000000);

    point = new GeoPoint(latitude,longitude);


   mapController.animateTo(point);   
   MapOverlay mapOverlay = new MapOverlay();
   List<Overlay> listOfOverlays = map.getOverlays();
   listOfOverlays.clear();
   listOfOverlays.add(mapOverlay);


    map.invalidate();

  } catch (IOException e) {
    Log.e("LocateMe", "Could not get friend location", e);
  }
}
 

ошибка всего журнала cat :

10-31 23:07:34.884: D / ddm-heap(234): получен запрос списка функций 10-31 23:08: 05.443: E / ActivityThread(234): не удалось найти информацию о поставщике для com.google.settings 10-31 23:08:05.443: E / ActivityThread(234): сбойчтобы найти информацию о поставщике для com.google.settings 10-31 23:08:05.475: E / ActivityThread(234): не удалось найти информацию о поставщике для com.google.settings 10-31 23:08:05.593: D / LocationManager(234): Constructor: service = android.location.ILocationManager $ Stub $Proxy@44dd4c38 10-31 23:08: 05.772: I / MapActivity (234): Обработка уведомления об изменении сети: ПОДКЛЮЧЕНО 10-31 23:08: 05.772: E / MapActivity (234): не удалось получить клиент фабрики соединений 10-31 23:08:12.012: D / LocationManager (234): removeUpdates: слушатель = com.example.gui.SendlocationActivity@44db4af0 10-31 23:08: 12.112: E / ActivityThread(234): не удалось найти информацию о поставщике для com.google.settings 10-31 23:08:12.112: E / ActivityThread(234): не удалось найти информацию о поставщике для com.google.settings 10-31 23:08:12.122: W / MapActivity(234): диспетчер утилизации com.google.googlenav.datarequest.DataRequestDispatcher@44db89f0 10-31 23:08:12.142: V / MapActivity(234): Утилизация объекта карты. 10-31 23:08:13.472: D / AndroidRuntime(234): завершение работы виртуальной машины 10-31 23:08:13.472: W / dalvikvm(234): threadid= 3: поток завершается с неперехваченным исключением (group = 0x4001b188) 10-31 23:08: 13.482: E/ AndroidRuntime(234): обработчик неперехваченного: основной поток завершается из-за неперехваченного исключения 10-31 23:08:13.822: E/AndroidRuntime(234): java.lang.RuntimeException: не удается запустить activity ComponentInfo{com.example.gui/com.example.gui.Friendlocation}: java.lang.Исключение NullPointerException 10-31 23:08:13.822: E/AndroidRuntime(234): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 10-31 23:08:13.822: E / AndroidRuntime(234): в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java: 2512) 10-3123:08:13.822: E/AndroidRuntime(234): на android.app.ActivityThread.access$ 2200(ActivityThread.java:119) 10-31 23:08:13.822: E /AndroidRuntime(234): в android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)10-31 23:08:13.822: E/AndroidRuntime(234): в android.os.Handler.DispatchMessage(Handler.java:99) 10-31 23:08:13.822: E / AndroidRuntime(234): в android.os.Looper.loop(Looper.java: 123) 10-31 23:08:13.822: E / AndroidRuntime(234): в android.app.ActivityThread.main(ActivityThread.java:4363) 10-31 23:08:13.822: E/ AndroidRuntime(234): на java.lang.reflect.Method.invokeNative(собственный метод) 10-31 23:08:13.822: E/AndroidRuntime(234): на java.lang.reflect.Метод.invoke(Метод.java:521) 10-31 23:08:13.822: E/AndroidRuntime(234): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 10-31 23:08:13.822: E / AndroidRuntime (234): вcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 10-31 23:08:13.822: E / AndroidRuntime(234): в dalvik.system.NativeStart.main(собственный метод) 10-31 23:08:13.822: E / AndroidRuntime(234): вызвано: java.lang.Исключение NullPointerException 10-31 23:08:13.822: E/AndroidRuntime(234): в com.example.gui.Расположение друзей.расположение друзей (Friendlocation.java:110) 10-31 23:08:13.822: E/AndroidRuntime(234): в com.example.gui.Расположение друзей.onCreate(Friendlocation.java:89) 10-31 23:08:13.822: E /AndroidRuntime(234): в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 10-31 23:08:13.822: E/AndroidRuntime(234): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 10-31 23:08:13.822: E/AndroidRuntime (234): … еще 11 10-31 23:08:13.842: I / dalvikvm(234): threadid = 7: реагирует на сигнал 3 10-31 23:08:13.972: I / dalvikvm (234): записал трассировку стека в ‘/data/anr/traces.txt ’10-31 23:08:21.046: Ввод/вывод (234): Отправка сигнала. PID: 234 SIG: 9 10-31 23:08:21.574: E / ActivityThread(253): не удалось найти информацию о поставщике для com.google.settings 10-31 23:08:21.574: E / ActivityThread(253): не удалось найти информацию о поставщике для com.google.settings 10-31 23:08:08:21.593: E / ActivityThread(253): не удалось найти информацию о поставщике для com.google.settings 10-31 23:08:21.733: D / LocationManager(253): Constructor: service = android.location.ILocationManager $Stub $Proxy@44dcb680 10-31 23:08:21.753: D/LocationActivity(253): Location[mProvider=gps,mTime=1319979600000,mLatitude=10.0,mLongitude=10.0,mHasAltitude=false,mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,mHasBearing=false,mBearing= 0.0, mHasAccuracy = false, mAccuracy = 0.0, mExtras = null] 10-31 23:08: 21.863: I / MapActivity(253): Обработка уведомления об изменении сети: ПОДКЛЮЧЕНО 10-31 23:08: 21.863: E / MapActivity(253): не удалось получить клиент фабрики соединений

Комментарии:

1. можете ли вы опубликовать полную трассировку стека исключения, которое выводится в Logcat при сбое вашего приложения? Есть много вещей, которые могут пойти не так, но трассировка стека покажет нам, где именно происходит сбой Android.

2. @plowman: я вставил весь журнал cat.извините за плохую презентацию, но я думаю, что точное копирование этого сделает его более понятным. Если есть что-то, что вы хотите спросить, пожалуйста, не стесняйтесь спрашивать и заранее благодарить.

3. Согласно трассировке стека, проблема заключается at com.example.gui.Friendlocation.friendlocation(Friendlocation.java:110) в том, что внутри Friendlocation.java , внутри friendlocation() метода, вкл line 110 , вы пытаетесь вызвать метод для чего-то, что имеет значение null. Я подозреваю, что это связано с String[] location , поэтому вы должны проверить это location.length == 2 перед вызовом location[0] или location[1] . Вы также должны распечатать latlon и location , прежде чем пытаться их использовать, чтобы быть уверенным, что они соответствуют вашим ожиданиям.

4. @plowman: Но как распечатать эти значения, я имею в виду, что я не могу распечатать их на консоли, как я делал раньше в java. Не могли бы вы, пожалуйста, как проверить latlon и местоположение, пожалуйста?

5. Ты пробовал System.out.println() ?

Ответ №1:

Вы можете передавать данные между действиями, используя намерения. В BroadcastReceiver, где вы получаете SMS, вы можете сделать что-то вроде этого:

 @Override
public void onReceive(Context context, Intent intent) {
    byte[] pdu = new byte[0]; //obviously use the real pdu in your app
    Intent intent = new Intent(this, NewActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra("smsPdu", pdu);
    context.startActivity(intent);
}
 

Затем внутри NewActivity вы можете сделать что-то вроде этого:

 @Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        byte[] pdu = getIntent().getByteArrayExtra("smsPdu");
        SmsMessage message = SmsMessage.createFromPdu(pdu);
}
 

Смотрите Документацию здесь для более подробного обзора намерений.

Комментарии:

1. @ plowman: При написании startActivity (намерения) Я получаю сообщение об ошибке, показывающее «создать метод startActivity() «. Мой класс receivingsms расширяет BroadcastReceiver. Не могли бы вы , пожалуйста , сказать мне , почему это так ?

2. @code_hacker: Я отредактировал свой пример, чтобы он был более понятным. Вы можете вызвать startActivity(), используя любой экземпляр Context, а также из любого метода действия. Обратите внимание на ту часть, где я добавляю intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) — это важно, чтобы избежать сбоев. Дайте мне знать, если это все еще не имеет смысла.

3. Я сделал именно то, что вы сказали, но мое приложение выходит из строя при получении sms-сообщения. Я помещаю оба файла (receivesms.java и friendlocation.java ). Пожалуйста, взгляните на это и дайте мне знать, какие могут быть возможные причины для этого?