我做了什么
我正在学习这些教程:
- developer.android.com/training/location/index.html
- developer.android.com/google/play-services/setup.html
- developer.android.com/tools/projects/projects-eclipse.html#ReferenceLibraryProject
我想我卡住的地方是上面页面中的“在清单文件中声明库组件”。
我猜这意味着该库尚未正确导入,或者我没有声明某些内容。事实上,我敢打赌这是我的错,我可能需要在清单文件或其他东西中声明一些东西。但是,我在谷歌上搜索的所有“声明活动 googleplayservices manifest”都让我相信,也许这个库没有什么要声明的——否则我肯定会遇到某种例子吗?
sdk 管理器
已安装 Google play 服务已安装
Google api
没有要安装的更新,所以不可能有任何过时的东西。
导入库项目
我已经导入了库(右键单击我的项目 > 属性 > android > 添加 > 播放服务库)。
尝试勾选和取消勾选“is library”复选框均无济于事。
清理项目和图书馆项目
我已多次安装并使用项目 > 清洁功能
Eclipse/ADT 已多次重新启动
错误:
Description Resource Path Location Type
GooglePlayServicesClient cannot be resolved to a type MainActivity.java /Atapp/src/com/atdev/atapp line 21 Java Problem
Description Resource Path Location Type
mLocationClient cannot be resolved MainActivity.java /Atapp/src/com/atdev/atapp line 184 Java Problem
Description Resource Path Location Type
Syntax error on token "mCurrentLocation", VariableDeclaratorId expected after this token MainActivity.java /Atapp/src/com/atdev/atapp line 162 Java Problem
Description Resource Path Location Type
The method onConnectionFailed(ConnectionResult) of type MainActivity must override or implement a supertype method MainActivity.java /Atapp/src/com/atdev/atapp line 126 Java Problem
(除其他外)。
提前感谢您的建议。第一次发帖,所以我希望我问得正确并且清楚。
代码
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.atdev.atapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.atdev.atapp.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="com.atdev.atapp.Venue"
android:label="@string/title_activity_venue"
android:parentActivityName="com.atdev.atapp.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.atdev.atapp.MainActivity" />
</activity>
</application>
</manifest>
主要活动java:
package com.atdev.atapp;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.content.IntentSender;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.LocationClient;
public class MainActivity extends Activity implements
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener {
// ************************************************************************
// GLOBAL CONSTANTS
// Define a request code to send to Google Play services. This code is returned in Activity.onActivityResult
private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
// Set the contents of the venue search field to this string
public final static String VENUE_SEARCH = "com.atroom.atroom.MESSAGE";
// Global variable to hold the current location
Location mCurrentLocation;
// Define a DialogFragment that displays the google play services error dialog
public static class ErrorDialogFragment extends DialogFragment {
// Global field to contain the error dialog
private Dialog mDialog;
// Default constructor. Sets the dialog field to null
public ErrorDialogFragment() {
super();
mDialog = null;
}
// Set the dialog to display
public void setDialog(Dialog dialog) {
mDialog = dialog;
}
// Return a Dialog to the DialogFragment.
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return mDialog;
}
}
// ********************************************************************************
// GOOGLE PLAY SERVICES METHODS
// Handle results returned to the FragmentActivity by Google Play services
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Decide what to do based on the original request code
switch (requestCode) {
case CONNECTION_FAILURE_RESOLUTION_REQUEST :
// If the result code is Activity.RESULT_OK, try to connect again
switch (resultCode) {
case Activity.RESULT_OK :
// Try the request again
break;
}
}
}
// Do the following to test whether Google Play Services are available and take relevant action
private boolean servicesConnected() {
// Check that Google Play services is available
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
// If Google Play services is available
if (ConnectionResult.SUCCESS == resultCode) {
// In debug mode, log the status
Log.d("Location Updates","Google Play services is available.");
// Continue
return true;
// Google Play services was not available for some reason
} else {
// Get the error code
int errorCode = connectionResult.getErrorCode();
// Get the error dialog from Google Play services
Dialog errorDialog = GooglePlayServicesUtil.getErrorDialog(
errorCode,
this,
CONNECTION_FAILURE_RESOLUTION_REQUEST);
// If Google Play services can provide an error dialog
if (errorDialog != null) {
// Create a new DialogFragment for the error dialog
ErrorDialogFragment errorFragment =
new ErrorDialogFragment();
// Set the dialog in the DialogFragment
errorFragment.setDialog(errorDialog);
// Show the error dialog in the DialogFragment
errorFragment.show(getSupportFragmentManager(),
"Location Updates");
}
}
}
// Location Services calls the following on successful connection to client
@Override
public void onConnected(Bundle dataBundle) {
// Display the connection status
Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
}
// Location Services calls the following if connection to the location client drops because of an error.
@Override
public void onDisconnected() {
// Display the connection status
Toast.makeText(this, "Disconnected. Please re-connect.",
Toast.LENGTH_SHORT).show();
}
// Location Services calls the following if the attempt to connect to Location Services fails
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
/*
* Google Play services can resolve some errors it detects.
* If the error has a resolution, try sending an Intent to
* start a Google Play services activity that can resolve
* error.
*/
if (connectionResult.hasResolution()) {
try {
// Start an Activity that tries to resolve the error
connectionResult.startResolutionForResult(
this,
CONNECTION_FAILURE_RESOLUTION_REQUEST);
/*
* Thrown if Google Play services canceled the original
* PendingIntent
*/
} catch (IntentSender.SendIntentException e) {
// Log the error
e.printStackTrace();
}
} else {
/*
* If no resolution is available, display a dialog to the
* user with the error.
*/
showErrorDialog(connectionResult.getErrorCode());
}
}
// *************************************************************************************
// LOCATION CONNECTION METHODS
// Set the current location to the last known location while a new location is being sought
mCurrentLocation = mLocationClient.getLastLocation();
// *************************************************************************************
// ACTIVITY METHODS
// Do the following when the activity is created
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create a new location client, using the enclosing class to handle callbacks
mLocationClient = new LocationClient(this, this, this);
}
// Do the following when the Activity becomes visible.
@Override
protected void onStart() {
super.onStart();
// Connect the client. This is in 'onStart' not 'onCreate' as we want to connect whenever
// the activity becomes visible, not just when the activity is started for the first time.
mLocationClient.connect();
}
// Do the following when the Activity is no longer visible.
@Override
protected void onStop() {
// Disconnecting the client invalidates it. This saves battery - we don't want the location
// to run in the background when the app/activity is not in use.
mLocationClient.disconnect();
super.onStop();
}
// Do the following when the menu is created
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// Do the following when the Venue Search button is clicked
public void sendVenueSearch (View view) {
Intent intent = new Intent(this, Venue.class);
EditText editText = (EditText) findViewById(R.id.venue_search);
String message = editText.getText().toString();
intent.putExtra(VENUE_SEARCH, message);
startActivity(intent);
}
}
主要活动xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:id="@+id/venue_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/button1"
android:ems="10"
android:hint="@+id/venue_search" >
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/venue_search"
android:layout_alignParentRight="true"
android:layout_marginBottom="34dp"
android:layout_marginRight="31dp"
android:onClick="sendVenueSearch"
android:text="@string/button_venue_search" />
<ListView
android:id="@+id/venueList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/venue_search"
android:layout_below="@+id/button1" >
</ListView>
</RelativeLayout>