Android 使用 FusedLocationProviderApi 定位
Android Location using FusedLocationProviderApi
我正在尝试使用 FusedLocationProviderApi 在我的平板电脑上获取位置数据,但每当我启动该应用程序时,我都会收到错误消息
E/MainActivity﹕连接失败:ConnectionResult{statusCode=SERVICE_VERSION_UPDATE_REQUIRED,resolution=null}
我不知道是什么导致了这个错误。我有一种非品牌平板电脑,我认为这可能是导致问题的原因。型号:DL701Q,Android 版本:4.4.2 和 google play build version 4.9.13
这是我的应用程序代码,在我测试以找出问题时,有些内容被注释掉了。
package temp;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import java.text.DateFormat;
import java.util.Date;
public class MainActivity extends Activity implements LocationListener,
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{
Button bLogout;
ImageButton bLogData;
GPSTracker gps;
TextView etLabel;
UserLocalStore userLocalStore;
Location mCurrentLocation;
String mLastUpdateTime;
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
private static final String TAG = "MainActivity";
private static final long INTERVAL = 1000 * 10;
private static final long FATEST_INTERVAL = 1000 * 5;
private static Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "On Create . . . . .");
// if(!isGooglePlayServicesAvailable()){
// finish();
// }
createLocationRequest();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
etLabel = (TextView) findViewById(R.id.etEmailLabel);
bLogout = (Button) findViewById(R.id.bLogout);
bLogData = (ImageButton) findViewById(R.id.DataLog);
// gps = new GPSTracker(MainActivity.this);
bLogData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
updateUI();
}
});
bLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
userLocalStore.clearuserData();
userLocalStore.setUserLoggedIn(false);
startActivity(new Intent(MainActivity.this, login.class));
}
});
userLocalStore = new UserLocalStore(this);
}
protected void createLocationRequest(){
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
@Override
public void onStart() {
super.onStart();
if(authenticate() == true){
displayUserDetails();
}else{
startActivity(new Intent(MainActivity.this, login.class));
}
Log.e(TAG, "onStart fired ..............");
mGoogleApiClient.connect();
Log.e(TAG, "onStart fired .............." + mGoogleApiClient.isConnected());
}
@Override
public void onStop() {
super.onStop();
Log.e(TAG, "onStop fired ..............");
// mGoogleApiClient.disconnect();
Log.e(TAG, "isConnected ...............: " + mGoogleApiClient.isConnected());
}
private boolean isGooglePlayServicesAvailable() {
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (ConnectionResult.SUCCESS == status) {
return true;
} else {
GooglePlayServicesUtil.getErrorDialog(status, this, 0).show();
return false;
}
}
@Override
public void onConnected(Bundle bundle) {
Log.e(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
startLocationUpdates();
}
protected void startLocationUpdates() {
PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
Log.e(TAG, "Location update started ..............: ");
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.e(TAG, "Connection failed: " + connectionResult.toString());
}
@Override
public void onLocationChanged(Location location) {
Log.e(TAG, "Firing onLocationChanged..............................................");
mCurrentLocation = location;
mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
updateUI();
}
private void updateUI() {
Log.e(TAG, "UI update initiated .............");
if (null != mCurrentLocation) {
String lat = String.valueOf(mCurrentLocation.getLatitude());
String lng = String.valueOf(mCurrentLocation.getLongitude());
Toast.makeText(getApplicationContext(), "Longitude: " + lng + "\nLatitude: "
+ lat, Toast.LENGTH_LONG).show();
} else {
Log.e(TAG, "location is null ...............");
Toast.makeText(getApplicationContext(), "Location Null", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPause() {
super.onPause();
// stopLocationUpdates();
}
protected void stopLocationUpdates() {
// LocationServices.FusedLocationApi.removeLocationUpdates(
// mGoogleApiClient, this);
Log.e(TAG, "Location update stopped .......................");
}
@Override
public void onResume() {
super.onResume();
if (mGoogleApiClient.isConnected()) {
startLocationUpdates();
Log.e(TAG, "Location update resumed .....................");
}
}
private void displayUserDetails(){
User user = userLocalStore.getLoggedInUser();
String userdisplay = "Logged in as: " + user.username;
etLabel.setText(userdisplay);
}
private boolean authenticate(){
return userLocalStore.getUserLoggedIn();
}
}
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="temp" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".login"
android:label="@string/title_activity_login" >
</activity>
<activity
android:name=".Register"
android:label="@string/title_activity_register" >
</activity>
</application>
</manifest>
构建文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "temp"
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.google.android.gms:play-services:7.5.0'
}
您应该将平板电脑上的 GooglePlay Services
服务 "app" 升级到更高版本,例如 7.5.74,以便与客户端库版本 7.5.0 交互
另请参阅 this 以获取有关如何升级它的更多说明
- 您首先要更新 google 播放服务。
您需要添加清单文件此元标记。
我正在尝试使用 FusedLocationProviderApi 在我的平板电脑上获取位置数据,但每当我启动该应用程序时,我都会收到错误消息
E/MainActivity﹕连接失败:ConnectionResult{statusCode=SERVICE_VERSION_UPDATE_REQUIRED,resolution=null}
我不知道是什么导致了这个错误。我有一种非品牌平板电脑,我认为这可能是导致问题的原因。型号:DL701Q,Android 版本:4.4.2 和 google play build version 4.9.13
这是我的应用程序代码,在我测试以找出问题时,有些内容被注释掉了。
package temp;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import java.text.DateFormat;
import java.util.Date;
public class MainActivity extends Activity implements LocationListener,
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{
Button bLogout;
ImageButton bLogData;
GPSTracker gps;
TextView etLabel;
UserLocalStore userLocalStore;
Location mCurrentLocation;
String mLastUpdateTime;
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
private static final String TAG = "MainActivity";
private static final long INTERVAL = 1000 * 10;
private static final long FATEST_INTERVAL = 1000 * 5;
private static Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "On Create . . . . .");
// if(!isGooglePlayServicesAvailable()){
// finish();
// }
createLocationRequest();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
etLabel = (TextView) findViewById(R.id.etEmailLabel);
bLogout = (Button) findViewById(R.id.bLogout);
bLogData = (ImageButton) findViewById(R.id.DataLog);
// gps = new GPSTracker(MainActivity.this);
bLogData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
updateUI();
}
});
bLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
userLocalStore.clearuserData();
userLocalStore.setUserLoggedIn(false);
startActivity(new Intent(MainActivity.this, login.class));
}
});
userLocalStore = new UserLocalStore(this);
}
protected void createLocationRequest(){
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
@Override
public void onStart() {
super.onStart();
if(authenticate() == true){
displayUserDetails();
}else{
startActivity(new Intent(MainActivity.this, login.class));
}
Log.e(TAG, "onStart fired ..............");
mGoogleApiClient.connect();
Log.e(TAG, "onStart fired .............." + mGoogleApiClient.isConnected());
}
@Override
public void onStop() {
super.onStop();
Log.e(TAG, "onStop fired ..............");
// mGoogleApiClient.disconnect();
Log.e(TAG, "isConnected ...............: " + mGoogleApiClient.isConnected());
}
private boolean isGooglePlayServicesAvailable() {
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (ConnectionResult.SUCCESS == status) {
return true;
} else {
GooglePlayServicesUtil.getErrorDialog(status, this, 0).show();
return false;
}
}
@Override
public void onConnected(Bundle bundle) {
Log.e(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
startLocationUpdates();
}
protected void startLocationUpdates() {
PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
Log.e(TAG, "Location update started ..............: ");
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.e(TAG, "Connection failed: " + connectionResult.toString());
}
@Override
public void onLocationChanged(Location location) {
Log.e(TAG, "Firing onLocationChanged..............................................");
mCurrentLocation = location;
mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
updateUI();
}
private void updateUI() {
Log.e(TAG, "UI update initiated .............");
if (null != mCurrentLocation) {
String lat = String.valueOf(mCurrentLocation.getLatitude());
String lng = String.valueOf(mCurrentLocation.getLongitude());
Toast.makeText(getApplicationContext(), "Longitude: " + lng + "\nLatitude: "
+ lat, Toast.LENGTH_LONG).show();
} else {
Log.e(TAG, "location is null ...............");
Toast.makeText(getApplicationContext(), "Location Null", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPause() {
super.onPause();
// stopLocationUpdates();
}
protected void stopLocationUpdates() {
// LocationServices.FusedLocationApi.removeLocationUpdates(
// mGoogleApiClient, this);
Log.e(TAG, "Location update stopped .......................");
}
@Override
public void onResume() {
super.onResume();
if (mGoogleApiClient.isConnected()) {
startLocationUpdates();
Log.e(TAG, "Location update resumed .....................");
}
}
private void displayUserDetails(){
User user = userLocalStore.getLoggedInUser();
String userdisplay = "Logged in as: " + user.username;
etLabel.setText(userdisplay);
}
private boolean authenticate(){
return userLocalStore.getUserLoggedIn();
}
}
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="temp" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".login"
android:label="@string/title_activity_login" >
</activity>
<activity
android:name=".Register"
android:label="@string/title_activity_register" >
</activity>
</application>
</manifest>
构建文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "temp"
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.google.android.gms:play-services:7.5.0'
}
您应该将平板电脑上的 GooglePlay Services
服务 "app" 升级到更高版本,例如 7.5.74,以便与客户端库版本 7.5.0 交互
另请参阅 this 以获取有关如何升级它的更多说明
- 您首先要更新 google 播放服务。
您需要添加清单文件此元标记。