我目前正试图在安卓系统上实现Google API for Java并与之合作。为了测试事物,我一直在遵循两个示例(CalendarSample,TasksSample)。调用AccountManager和其他内容的代码与两个示例中的代码相同。但是,下面的代码对我不起作用,导致了一个NullPointerException
startActivityForResult(credential.newChooseAccountIntent(),2); --我是从一个普通的Activity中调用的,点击按钮后,onCreate已经被调用了。我已经尝试搜索了几个小时的谷歌和其他信息来源,但似乎没有任何效果。
清单:
<activity
android:name=".ManageAccounts"
android:label="@string/title_activity_manage_accounts"
android:launchMode="singleTop"
android:parentActivityName=".SettingsActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />以下是全部活动:
public class ManageAccounts extends Activity implements GoogleLoginFragment.OnSignedIn{
DataHandler dataHandler;
//for testing of google add friend
private static final String PREF_ACCOUNT_NAME = "accountName";
Circles service;
final HttpTransport httpTransport = AndroidHttp.newCompatibleTransport();
final JsonFactory jsonFactory = GsonFactory.getDefaultInstance();
static final int REQUEST_GOOGLE_PLAY_SERVICES = 0;
static final int REQUEST_AUTHORIZATION = 1;
static final int REQUEST_ACCOUNT_PICKER = 2;
GoogleAccountCredential credential;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manage_accounts);
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
dataHandler = new DataHandler(this);
//Add GoogleLoginFragment
GoogleLoginFragment.attachToActivity(this);
//testing of google add friend code
GoogleAccountCredential credential =
GoogleAccountCredential.usingOAuth2(this, Collections.singleton(CirclesScopes.CIRCLE_ADD +" "+ CirclesScopes.CIRCLES));
SharedPreferences settings = this.getPreferences(Context.MODE_PRIVATE);
credential.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
service =
new Circles.Builder(httpTransport, jsonFactory, credential)
.setApplicationName("Social Contacts/1.0").build();
Log.i("Activity","onCreateDone");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.manage_accounts, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//Request Code for Twitter button: 140
if (requestCode == 140) {
loginButton.onActivityResult(requestCode, resultCode, data);
}
switch (requestCode) {
case REQUEST_GOOGLE_PLAY_SERVICES:
if (resultCode == Activity.RESULT_OK) {
haveGooglePlayServices();
} else {
checkGooglePlayServicesAvailable();
}
break;
case REQUEST_AUTHORIZATION:
if (resultCode == Activity.RESULT_OK) {
// AsyncLoadTasks.run(this);
} else {
chooseAccount();
}
break;
case REQUEST_ACCOUNT_PICKER:
if (resultCode == Activity.RESULT_OK && data != null && data.getExtras() != null) {
String accountName = data.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME);
if (accountName != null) {
credential.setSelectedAccountName(accountName);
SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString(PREF_ACCOUNT_NAME, accountName);
editor.commit();
// AsyncLoadTasks.run(this);
}
}
break;
}
}
public void onSignedIn(GoogleApiClient googleApiClient) {
GoogleSocialActions gsa = new GoogleSocialActions(googleApiClient, dataHandler, this);
gsa.saveAuthenticatedUser();
}
/** Check that Google Play services APK is installed and up to date. */
private boolean checkGooglePlayServicesAvailable() {
final int connectionStatusCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (GooglePlayServicesUtil.isUserRecoverableError(connectionStatusCode)) {
showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
return false;
}
return true;
}
void showGooglePlayServicesAvailabilityErrorDialog(final int connectionStatusCode) {
runOnUiThread(new Runnable() {
public void run() {
Dialog dialog =
GooglePlayServicesUtil.getErrorDialog(connectionStatusCode, ManageAccounts.this,
REQUEST_GOOGLE_PLAY_SERVICES);
dialog.show();
}
});
}
private void haveGooglePlayServices() {
// check if there is already an account selected
if (credential.getSelectedAccountName() == null) {
// ask user to choose account
chooseAccount();
} else {
// load calendars
// AsyncLoadTasks.run(this);
}
}
private void chooseAccount() {
startActivityForResult(credential.newChooseAccountIntent(), 2);
}
public void chooser(View view) {
if (view.getId() == R.id.chooser) {
startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}
}}
Stacktrace如下所示。在第204行的NullPointer是上面所示的一行。
java.lang.IllegalStateException: Could not execute method of the activity at android.view.View$1.onClick(View.java:3602) at android.view.View.performClick(View.java:4095) at android.view.View$PerformClick.run(View.java:17078) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4872) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at android.view.View$1.onClick(View.java:3597) at android.view.View.performClick(View.java:4095) at android.view.View$PerformClick.run(View.java:17078) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4872) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at com.example.martin.contacts.ManageAccounts.chooser(ManageAccounts.java:204) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at android.view.View$1.onClick(View.java:3597) at android.view.View.performClick(View.java:4095) at android.view.View$PerformClick.run(View.java:17078) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4872) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) at dalvik.system.NativeStart.main(Native Method)
发布于 2015-03-24 05:49:36
你从credential.newChooseAccountIntent()那里得到什么意图了吗??堆栈跟踪表明您没有得到任何意图,因此无法调用startActivityForResult()。
更新答复
您将GoogleAccountCredential credential;作为实例成员。但是您还没有初始化这个成员。在您的onCreate中,您已经声明了另一个本地credential,但是您的成员credential从未正确初始化,下面是您的有问题的行-
//testing of google add friend code
GoogleAccountCredential credential =
GoogleAccountCredential.usingOAuth2(this, Collections.singleton(CirclesScopes.CIRCLE_ADD +" "+ CirclesScopes.CIRCLES));相反,你应该只写
//testing of google add friend code
credential =GoogleAccountCredential.usingOAuth2(this, Collections.singleton(CirclesScopes.CIRCLE_ADD +" "+ CirclesScopes.CIRCLES));https://stackoverflow.com/questions/29225706
复制相似问题