Dan*_*e B 11 android google-maps google-play-services google-maps-android-api-2 location-services
我的应用目前正在使用Google地图 Google Play Services
speficying:
mMap.setMyLocationEnabled(true);
每当我在我的应用程序中显示地图时,我都会意识到:
但是,我可以看到有些应用程序使用地图并仍然显示位置蓝点,但位置图标不会出现在顶部栏中,并且它们的电池使用率很低.
我的应用目前授予两种权限:
android.permission.ACCESS_COARSE_LOCATIONandroid.permission.ACCESS_FINE_LOCATION我的问题是:
如何在电池使用率低的情况下显示蓝点位置?
是否可以通过代码指定准确度/电池使用情况?
UPDATE
实际上我意识到这样做的方法是使用GoogleApiClient'sFusedLocationApi
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
Run Code Online (Sandbox Code Playgroud)
我在我的Activity中配置了GoogleApiClient,调用:
GoogleApiClient.connect() 在活动的开始GoogleApiClient.disconnect() 在活动的停止在onConnected回调中,我设置了位置更新的标准:1分钟的最快间隔,具有低功率优先级:
private static final LocationRequest REQUEST = LocationRequest.create()
.setFastestInterval(60000) // in milliseconds
.setInterval(180000) // in milliseconds
.setPriority(LocationRequest.PRIORITY_LOW_POWER);
@Override
public void onConnected(Bundle bundle) {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient,
REQUEST,
this); // LocationListener
}
Run Code Online (Sandbox Code Playgroud)
我已经测试了GoogleApiClient在开始时正确连接,但出于某些原因,每当我使用嵌入式MapView访问片段时,我仍然可以在设置/位置屏幕上为我的应用程序获得高电量!
似乎MapView忽略了这些低功耗标准!
Dan*_*e B 29
最终找到了解决方案! 感谢特里斯坦的回答!
默认情况下,GoogleMap使用其位置提供程序,而不是融合位置提供程序.为了使用融合位置提供程序(允许您控制位置精度和功耗),您需要明确设置地图位置源GoogleMap.setLocationSource()(文档)
我在这里报告了一个样本活动:
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener;
import com.google.android.gms.maps.LocationSource;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends FragmentActivity
implements
ConnectionCallbacks,
OnConnectionFailedListener,
LocationSource,
LocationListener,
OnMyLocationButtonClickListener,
OnMapReadyCallback {
private GoogleApiClient mGoogleApiClient;
private TextView mMessageView;
private OnLocationChangedListener mMapLocationListener = null;
// location accuracy settings
private static final LocationRequest REQUEST = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMessageView = (TextView) findViewById(R.id.message_text);
SupportMapFragment mapFragment =
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
@Override
protected void onResume() {
super.onResume();
mGoogleApiClient.connect();
}
@Override
public void onPause() {
super.onPause();
mGoogleApiClient.disconnect();
}
@Override
public void onMapReady(GoogleMap map) {
map.setLocationSource(this);
map.setMyLocationEnabled(true);
map.setOnMyLocationButtonClickListener(this);
}
public void showMyLocation(View view) {
if (mGoogleApiClient.isConnected()) {
String msg = "Location = "
+ LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
}
}
/**
* Implementation of {@link LocationListener}.
*/
@Override
public void onLocationChanged(Location location) {
mMessageView.setText("Location = " + location);
if (mMapLocationListener != null) {
mMapLocationListener.onLocationChanged(location);
}
}
@Override
public void onConnected(Bundle connectionHint) {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient,
REQUEST,
this); // LocationListener
}
@Override
public void onConnectionSuspended(int cause) {
// Do nothing
}
@Override
public void onConnectionFailed(ConnectionResult result) {
// Do nothing
}
@Override
public boolean onMyLocationButtonClick() {
Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
// Return false so that we don't consume the event and the default behavior still occurs
// (the camera animates to the user's current position).
return false;
}
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mMapLocationListener = onLocationChangedListener;
}
@Override
public void deactivate() {
mMapLocationListener = null;
}
}
Run Code Online (Sandbox Code Playgroud)
Tri*_*ide 14
您将希望使您的活动(或更好地为此目的的单独对象)实现该LocationSource接口.
很简单,您需要存储activate()方法中传递的侦听器,并在更新位置时调用它,并在调用时忘记它deactivate().有关示例,请参阅此答案,您可能希望更新它以使用FusedLocationProvider.
完成此设置后,您可以将活动作为LocationSource地图传递,如此mMap.setLocationSource(this)(文档).
这将阻止地图使用其LocationSource使用高电池使用位置服务的默认值.
| 归档时间: |
|
| 查看次数: |
16657 次 |
| 最近记录: |