2015-04-12 80 views
0

我想更新地图,并从短信接收坐标。 接收器被调用,但无效的refreshMap没有。 下面是代码:未在广播接收器中调用的方法

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.telephony.SmsMessage; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

public class MainActivity extends FragmentActivity implements LocationListener { 

    GoogleMap googleMap; 
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 

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

     IntentFilter filter = new IntentFilter(Intent.ACTION_DEFAULT); 
     filter.addAction(SMS_RECEIVED); 
     filter.setPriority(1000); 
     this.registerReceiver(this.smsReceiver, filter); 

     // Getting reference to the SupportMapFragment of activity_main.xml 
     SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 

     // Getting GoogleMap object from the fragment 
     googleMap = fm.getMap(); 

     // Enabling MyLocation Layer of Google Map 
     googleMap.setMyLocationEnabled(true);    


     // Getting LocationManager object from System Service LOCATION_SERVICE 
     LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

     // Creating a criteria object to retrieve provider 
     Criteria criteria = new Criteria(); 

     // Getting the name of the best provider 
     String provider = locationManager.getBestProvider(criteria, true); 

     // Getting Current Location 
     Location location = locationManager.getLastKnownLocation(provider); 

     if(location!=null){ 
       onLocationChanged(location); 
     } 

     locationManager.requestLocationUpdates(provider, 20000, 0, this); 

    } 


    private BroadcastReceiver smsReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) 
           {            
            refreshMap(); //with the parsed coordinates from sms 
           }      
          } 
         }catch(Exception e){ 
//         Log.d("Exception caught",e.getMessage()); 
         } 
        } 
       } 

      } 
      }; 


    @Override 
    public void onLocationChanged(Location location) { 

     TextView tvLocation = (TextView) findViewById(R.id.tv_location); 

     // Getting latitude of the current location 
     double latitude = location.getLatitude(); 

     // Getting longitude of the current location 
     double longitude = location.getLongitude();  

     // Creating a LatLng object for the current location 
     LatLng latLng = new LatLng(latitude, longitude); 

     // Showing the current location in Google Map 
     googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 

     // Zoom in the Google Map 
     googleMap.animateCamera(CameraUpdateFactory.zoomTo(15)); 

     // Setting latitude and longitude in the TextView tv_location 
     tvLocation.setText("Latitude:" + latitude + ", Longitude:"+ longitude);  

    } 




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

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    public void refreshMap() { 
     // TODO Auto-generated method stub 
     Log.e("MAP","IS refreshing"); //NEVER CAlled 
    } 
} 

我尝试了几种方式,但refreshMap()从未被调用。 任何帮助将是伟大的。

编辑:这里是logcat的

04-12 13:48:41.046: I/SELinux(17737): Function: selinux_android_load_priority [0], There is no sepolicy file. 
04-12 13:48:41.046: I/SELinux(17737): 
04-12 13:48:41.066: I/SELinux(17737): Function: selinux_android_load_priority , spota verifySig and checkHash pass. priority version is VE=SEPF_SM-N9005_4.4.2_0040 
04-12 13:48:41.066: I/SELinux(17737): 
04-12 13:48:41.066: I/SELinux(17737): 
04-12 13:48:41.066: I/SELinux(17737): selinux_android_seapp_context_reload: seapp_contexts file is loaded from /data/security/spota/seapp_contexts 
04-12 13:48:41.066: E/dalvikvm(17737): >>>>> Normal User 
04-12 13:48:41.066: E/dalvikvm(17737): >>>>> in.wptrafficanalyzer.locationingooglemapv2 [ userId:0 | appId:10623 ] 
04-12 13:48:41.066: D/dalvikvm(17737): Late-enabling CheckJNI 
04-12 13:48:41.296: W/ApplicationPackageManager(17737): getCSCPackageItemText() 
04-12 13:48:41.296: I/PersonaManager(17737): getPersonaService() name persona_policy 
04-12 13:48:41.356: E/MoreInfoHPW_ViewGroup(17737): Parent view is not a TextView 
04-12 13:48:41.406: I/x(17737): Making Creator dynamically 
04-12 13:48:41.446: I/Google Maps Android API(17737): Google Play services client version: 6587000 
04-12 13:48:41.466: I/Google Maps Android API(17737): Google Play services package version: 7099038 
04-12 13:48:42.076: D/dalvikvm(17737): GC_FOR_ALLOC freed 4205K, 24% free 20808K/27180K, paused 38ms, total 39ms 
04-12 13:48:42.356: D/AbsListView(17737): Get MotionRecognitionManager 
04-12 13:48:42.366: D/AbsListView(17737): onVisibilityChanged() is called, visibility : 8 
04-12 13:48:42.366: D/AbsListView(17737): unregisterIRListener() is called 
04-12 13:48:42.376: D/AbsListView(17737): onVisibilityChanged() is called, visibility : 8 
04-12 13:48:42.376: D/AbsListView(17737): unregisterIRListener() is called 
04-12 13:48:42.416: D/dalvikvm(17737): GC_FOR_ALLOC freed 1184K, 21% free 21645K/27180K, paused 26ms, total 26ms 
04-12 13:48:42.456: W/ActivityThread(17737): ClassLoader.loadClass: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader()); 
04-12 13:48:42.526: I/System.out(17737): Thread-72732(HTTPLog):isShipBuild true 
04-12 13:48:42.526: I/System.out(17737): Thread-72732(HTTPLog):SmartBonding Enabling is true, SHIP_BUILD is true, log to file is false, DBG is false 
04-12 13:48:42.586: D/AbsListView(17737): onVisibilityChanged() is called, visibility : 0 
04-12 13:48:42.586: D/AbsListView(17737): unregisterIRListener() is called 
04-12 13:48:42.616: E/Activity :(17737): resumed 
04-12 13:48:42.626: I/dalvikvm(17737): Could not find method android.content.pm.PackageManager.getPackageInstaller, referenced from method com.google.android.gms.common.ff.a 
04-12 13:48:42.626: W/dalvikvm(17737): VFY: unable to resolve virtual method 479: Landroid/content/pm/PackageManager;.getPackageInstaller()Landroid/content/pm/PackageInstaller; 
04-12 13:48:42.626: D/dalvikvm(17737): VFY: replacing opcode 0x6e at 0x000d 
04-12 13:48:42.636: D/AbsListView(17737): onVisibilityChanged() is called, visibility : 4 
04-12 13:48:42.636: D/AbsListView(17737): unregisterIRListener() is called 
04-12 13:48:42.646: D/AbsListView(17737): onVisibilityChanged() is called, visibility : 0 
04-12 13:48:42.646: D/AbsListView(17737): unregisterIRListener() is called 
04-12 13:48:42.646: D/AbsListView(17737): unregisterIRListener() is called 
04-12 13:48:42.686: I/Adreno-EGL(17737): <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: () 
04-12 13:48:42.686: I/Adreno-EGL(17737): OpenGL ES Shader Compiler Version: E031.24.00.08+13 
04-12 13:48:42.686: I/Adreno-EGL(17737): Build Date: 03/28/14 Fri 
04-12 13:48:42.686: I/Adreno-EGL(17737): Local Branch: 0328_AU200_patches 
04-12 13:48:42.686: I/Adreno-EGL(17737): Remote Branch: 
04-12 13:48:42.686: I/Adreno-EGL(17737): Local Patches: 
04-12 13:48:42.686: I/Adreno-EGL(17737): Reconstruct Branch: 
04-12 13:48:42.786: D/OpenGLRenderer(17737): Enabling debug mode 0 
04-12 13:48:42.796: D/AbsListView(17737): unregisterIRListener() is called 
+0

任何异常抓? – immibis

+0

我编辑过,你现在可以看到Logcat –

+0

是否有任何异常? – immibis

回答

0

我认为你需要调用refreshMap方法在UI线程,就像这样:

 private BroadcastReceiver smsReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) 
          {  
           MainActivity.this.runOnUiThread(new Runnable() { 
            @Override 
            public void run() {  
             refreshMap(); //with the parsed coordinates from sms 
            } 
           }); 
          }      
         } 
        }catch(Exception e){ 
         Log.d("Exception caught",e.getMessage()); 
        } 
       } 
      } 

     } 
     }; 
+0

我用你的代码替换了我的代码,但它不会被调用:-( –