我使用最新版本的Google Play服务(7.0)并按照其指南中给出的步骤操作,并启用了如下所示的位置对话框,其中包含"从不"按钮.我的应用程序强制要求位置,所以我不想向用户显示永远不会,因为一旦用户点击"从不",我就无法再获取位置或请求位置.
谷歌地图只有是和没有按钮没有从不按钮,任何想法如何实现相同?
我的应用程序的图像

谷歌地图的形象

对于提示用户转到设置页面并启用位置服务并再次返回的传统方法,我注意到在一些最新的应用程序中执行相同操作的更简单方法.
参考下面的截图,它会提示一个对话框,用户只需点击一下鼠标,使定位服务,它在这些应用程序的工作原理.
我怎样才能实现同样的目标?
我想谷歌地图显示用户的位置.我尝试了这段代码,但它在Android 6上无效.
private GoogleMap map;
LocationManager lm;
LocationListener ll;
Location l;
LatLng pos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_layout);
lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
ll = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
l = (Location) location;
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onProviderDisabled(String provider) {}
};
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.nMap);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
map = …Run Code Online (Sandbox Code Playgroud) 我想定期(比如每2分钟)当前位置更新为这个我下面的官方文档,我写了这个代码,但它不会给当前的位置即使在我传递requestLocationUpdates LocationRequest对象指定每两分钟更新( ),这里是代码:
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{
private FusedLocationProviderClient FusedLocationClient;
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
SupportMapFragment map =
getSupportFragmentManager().findFragmentById(R.id.map));
map.getMapAsync(this);
FusedLocationClient LocationServices.getFusedLocationProviderClient(this);
}
@Override
public void onConnected(Bundle bundle) {
FusedLocationClient.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
Log.i("MainActivity ", "" + location.getLongitude())
}
}
});
FusedLocationClient = …Run Code Online (Sandbox Code Playgroud) java android google-maps-android-api-2 android-fusedlocation
在我的应用程序中,如果用户没有打开位置,我会通过对话框提示,然后尝试通过覆盖活动结果返回该结果(可能不正确).
这是一个片段,所以不确定如何改变事物:
这就是我用startResolutionForResult调用它的对话框:
public void checkDeviceLocationIsOn()
{
System.out.println("Test running setting request" );
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
builder.setAlwaysShow(true); //this is the key ingredient
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(LocationSettingsResult result) {
final Status status = result.getStatus();
final LocationSettingsStates state = result.getLocationSettingsStates();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
// All location settings are satisfied.
System.out.println("Test setting all fine starting location request" );
getLocation();
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are …Run Code Online (Sandbox Code Playgroud) 我正在使用谷歌+登录到我的应用程序,当我使用活动完成它的工作魅力,然后我将我的代码移动到一个片段,然后当我尝试登录到谷歌+它不工作我必须打开片段活动2次登录谷歌+任何人都可以告诉我,下面添加了片段的代码发生了什么
public class GooglePluseFragment extends Fragment implements
ConnectionCallbacks, OnConnectionFailedListener {
private static final int RC_SIGN_IN = 0;
private static final String TAG = "MainActivity";
private static final int PROFILE_PIC_SIZE = 800;
private GoogleApiClient mGoogleApiClient;
private boolean mIntentInProgress;
private boolean mSignInClicked;
private ConnectionResult mConnectionResult;
private SignInButton btnSignIn;
private Button btnSignOut;
private Context mContext;
private Activity mActivity;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = getActivity();
mContext = getActivity().getApplicationContext();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View …Run Code Online (Sandbox Code Playgroud) android android-fragments google-plus android-fragmentactivity
我正在开发一个应用程序,需要集成GPS位置.我想以编程方式切换GPS.条件是:我不想将用户发送到"设置"面板以启用它.我想强有力地启用它或单个提示将起作用(类似于Ola Cabs Android应用程序).在这个网站上有很多问题,但每个人都在寻找像Ola Cabs app这样的类似功能.所以我已经启动了这个帖子,以便我们所有人都清楚.
我已经看到了这个Q&A LocationSettingsRequest对话框 - 跳过了onActivityResult().这不是同一个问题,因为一切都在Activity中完成.
使用的代码几乎是逐字逐句的,在Google Play服务示例中给出了.
我有一个活动,LocationActivity它连接到GoogleApiClient以获取用户的位置.连接后,我创建一个LocationSettingsRequest以确保打开位置设置.活动正在实施ResultCallback<LocationSettingsResult>.
ResultCallback<LocationSettingsResult>.onResult()被称为如果result.getStatus().getStatusCode() == LocationSettingsStatusCodes.RESOLUTION_REQUIRED再status.startResolutionForResult(this, REQUEST_CHECK_SETTINGS)被称为并且所示的对话框.无论选择什么,问题onActivityResult()都不会被调用.
@Override
public void onConnected(Bundle connectionHint) {
Log.i(TAG, "GoogleApiClient connected");
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(new LocationRequest().setPriority(LocationRequest.PRIORITY_LOW_POWER));
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
result.setResultCallback(this);
}
Run Code Online (Sandbox Code Playgroud)
.
@Override
public void onResult(LocationSettingsResult result) {
final Status status = result.getStatus();
Log.d(TAG, "onResult() called with: " + "result = [" + status.getStatusMessage() + "]");
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
getLocation(); …Run Code Online (Sandbox Code Playgroud) 所以我花了几个星期的时间在我的Android应用程序上工作,并研究实现我需要做的最好的方法,但仍然无法正确完成..任何/所有帮助都非常感谢,因为我是仍然掌握着一切......
(假设"位置"/ GPS设置当前已关闭),我需要让我的应用程序一直在监听"位置"设置是否打开..此时,只需启动一个活动.
这些是我认为可能有用的不同方式:
LocationListener使用"onProviderEnabled"
使用"onGpsStatusChanged"和"GPS_EVENT_STARTED"的GpsStatusListener
GpsProvider需要卫星(以确定它是否启动),或以某种方式使用GpsProvider的"AVAILABLE"Constant/int
使用"ACTION_SERVICE_INTENT"(和/或)"ACTION_INJECTED_SETTING_CHANGED"与"onGetEnabled"或"isEnabled"的SettingInjectorService
Settings.Secure使用"LOCATION_MODE"!="LOCATION_MODE_OFF"
ContentObserver/ContentResolver
意图getAction(...)
某种"if/else"
任何以下任何问题的建议或答案都非常感谢..
以上哪些想法是完成任务的最佳方式?越简单越好,但最重要的是它需要一直监听,并在打开位置设置时立即响应.
对于上述哪个观点效果最好,我将如何实现它?(例如,我需要一个BroadcastListener?还是一个服务?它将如何组合在一起?
我非常感谢你能给我的任何建议或帮助..我仍然掌握所有这一切,但有足够的信心去做,并渴望发布我的第一个应用程序..所以谢谢你,这意味着很多并将极大地帮助我.
编辑:
好的所以这就是我到目前为止所得到的......
继承人
我的接收者:
MyReceiver.Java
public class MyReceiver extends BroadcastReceiver {
private final static String TAG = "LocationProviderChanged";
boolean isGpsEnabled;
boolean isNetworkEnabled;
public MyReceiver() {
// EMPTY
// MyReceiver Close Bracket
}
// START OF onReceive
@Override
public void onReceive(Context context, Intent intent) {
// PRIMARY RECEIVER
if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
Log.i(TAG, "Location Providers Changed");
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
isGpsEnabled = …Run Code Online (Sandbox Code Playgroud) 我曾经使用过FusedLocationApi,直到我得知它已被弃用(参见下面的参考资料).实施起来很简单.正如文档所说,您需要将其与GoogleApiClient结合使用
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,
locationRequest, this);
Run Code Online (Sandbox Code Playgroud)
我最近更改为FusedLocationProviderClient(参见下面的参考资料)根据教程,我能够成功地使FusedLocationProviderClient工作
教程:https://github.com/codepath/android_guides/wiki/Retrieving-Location-with-LocationServices-API
// new Google API SDK v11 uses getFusedLocationProviderClient(this)
getFusedLocationProviderClient(this).requestLocationUpdates(mLocationRequest, new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
// do work here
onLocationChanged(locationResult.getLastLocation();
}
},
Looper.myLooper());
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是Looper线程.即使应用程序在后台运行,Looper线程也会继续运行.我想在应用程序在后台时暂停位置更新,然后在应用程序位于前台时恢复位置更新.我怎样才能做到这一点?
参考文献:
代码片段:
private fun requestHint() {
val hintRequest = HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build()
val credentialsClient = Credentials.getClient(this)
val intent = credentialsClient.getHintPickerIntent(hintRequest)
try {
startIntentSenderForResult(
intent.intentSender,
CREDENTIAL_PICKER_REQUEST,
null, 0, 0, 0
)
} catch (e: IntentSender.SendIntentException) {
e.printStackTrace()
}
}
Run Code Online (Sandbox Code Playgroud)
我试图从文档中解决这个问题,但我不明白
如果有人知道如何解决请帮忙
谢谢
问题,当我打电话使用GoogleApiClient以编程方式启用gps片段...我的代码是..
final Status status = result.getStatus();
final LocationSettingsStates state = result.getLocationSettingsStates();
switch (status.getStatusCode())
{
case LocationSettingsStatusCodes.SUCCESS:
// All location settings are satisfied. The client can initialize location
// requests here.
getCurrentLocation();
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the user
// a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
status.startResolutionForResult(getActivity(), REQUEST_ID_GPS_PERMISSIONS);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
}
break; …Run Code Online (Sandbox Code Playgroud)