2017-01-24 15 views
0

我使用fusedapi寫下面的代碼來獲取lat和longi。從服務中獲取值進入活動

import android.app.Service; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ActivityCompat; 
import android.util.Log; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 

/** 
* Created by DELL WORLD on 1/24/2017. 
*/ 

public class LocationWithFusedApi extends Service implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks, LocationListener { 
    private GoogleApiClient mGoogleApiClient; 
    Location mLastLocation; 
    private LocationRequest mLocationRequest; 
    double lat, lon; 
    final static String Mydata = "MyData"; 

    /* public LocationWithFusedApi() { 
     super("LocationWithFusedApi"); 
    }*/ 
/* 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mGoogleApiClient.disconnect(); 
    }*/ 

    @Override 
    public void onStart(Intent intent, int startId) { 
     Log.d("LocationWithFusedAPI", "Called"); 
     super.onStart(intent, startId); 
     mGoogleApiClient.connect(); 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    /* @Override 
    protected void onHandleIntent(Intent intent) { 

    }*/ 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     buildGoogleApiClient(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     lat = location.getLatitude(); 
     lon = location.getLongitude(); 
     System.out.println("Latest" + lat + ":" + lon); 
     Intent intent = new Intent(); 
     intent.setAction("Mydata"); 
     intent.putExtra("lat",lat); 
     intent.putExtra("lon",lon); 
     sendBroadcast(intent); 
     sendlat(); 
     sendlon(); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 

     mLocationRequest = LocationRequest.create(); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     mLocationRequest.setInterval(100); // Update location every second 

     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 


     if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
       mGoogleApiClient); 
     if (mLastLocation != null) { 
      lat = mLastLocation.getLatitude(); 
      lon = mLastLocation.getLongitude(); 
      System.out.println("Last" + lat + ":" + lon); 
      sendlat(); 
      sendlon(); 

     } 

    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     buildGoogleApiClient(); 
    } 

    synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    public double sendlat() { 
     return lat; 
    } 

    public double sendlon() { 
     return lon; 
    } 

    public void removeupdate() { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    } 

} 

現在試圖在另一個活動中獲取緯度和經度值,以通過調用sendlat和sendlon向用戶顯示,但變爲空值。我在做什麼錯誤。 這裏是我試圖獲得價值的活動的代碼。

public class ShareLocation extends AppCompatActivity { 
    GPSDataPicker gps; 
    String clickable = ""; 
    Latlonreceiver latlonreceiver; 
    double lat, lon; 

    @Override 
    protected void onStart() { 
     latlonreceiver = new Latlonreceiver(); 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(LocationWithFusedApi.Mydata); 
     registerReceiver(latlonreceiver, intentFilter); 

     Intent intent = new Intent(ShareLocation.this, LocationWithFusedApi.class); 
     startService(intent); 
     super.onStart(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     /* LocationWithFusedApi locationWithFusedApi = new LocationWithFusedApi(); 
     double latitude = locationWithFusedApi.sendlat(); 
     double longitude = locationWithFusedApi.sendlon();*/ 

     double latitude = lat; 
     double longitude = lon; 
     setContentView(R.layout.sharelocation); 



         clickable = "https://maps.google.com/?q=" + latitude + "," + longitude; 
} 
} 
@Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     unregisterReceiver(latlonreceiver); 
    } 
    public class Latlonreceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      lat = intent.getDoubleExtra("lat", 0.0); 
      lon = intent.getDoubleExtra("lon", 0.0); 

     } 
    } 
+2

在第二個(接收)活動中使用'BroadcastReceiver',並將這兩個值作爲額外值添加到您的廣播Intent中。另外,確保在'onCreate()','onResume()'和'onPause()'和'onDestroy()'中註冊/取消註冊'IntentFilters'。 – Shark

+0

無法正常工作。仍是同樣的問題。我正在更新代碼。 – Panache

+1

是在'onReceive()'甚至發射/被調用? – Shark

回答

0

使用廣播接收機進行研究。這裏的基本錯誤是,位置的檢索是異步運行在不同的線程上的。所以當你調用你的sendXxx()方法時,位置還沒有解決。使用異步代碼,您需要該服務在位置解析後推送結果。這種情況下的標準方式是廣播接收機。