端点方法如下所示:
@Api(
name = "gameape",
version = "v1",
description = "Game App API",
audiences = { "mynumber.apps.googleusercontent.com" },
clientIds = { "mynumber.apps.googleusercontent.com", Constant.API_EXPLORER_CLIENT_ID },
defaultVersion = AnnotationBoolean.TRUE)
public class GameApp {
private final AccountDao accountDao = new AccountDaoImpl();
@ApiMethod(name = "LoginUser", path = "LoginUser", httpMethod = HttpMethod.POST)
public void LoginUser(LoginData request) {
long phone = request.getPhone();
String deviceId = request.getDeviceId();
String gcmToken = request.getGcmToken();
Account acc = new Account(phone, deviceId, gcmToken);
accountDao.put(acc);
ApiHelper.sendGCM(phone, "welcome to my game app");
}
}
android的片段如下所示:
@Override
protected Boolean doInBackground(Void... params) {
LoginData request = new LoginData();
request.setUsername(username);
request.setPassword(password);
try {
RegisterUser reg = service.registerUser(request);
reg.execute();
return true;
} catch (Exception e) {
Log.e(LoginActivity.class.getName(),
"Exception received from server at "
+ service.getRootUrl(), e);
}
return false;
}
调用reg.execute()
不断抛出异常:
java.lang.IllegalArgumentException: the name must not be empty: null
从服务器控制台看,它甚至看起来都没有被命中。即使我尝试在调试模式下运行服务器,也不会到达断点(方法内的第一行)。
编辑:添加堆栈跟踪:
04-03 13:38:42.688: I/com.me.gameapp.LoginActivity$UserLoginTask(11255): Enter doInBackground
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): Exception received from server at https://1.myapp.appspot.com/_ah/api/
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): java.lang.IllegalArgumentException: the name must not be empty: null
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at android.os.Parcel.readException(Parcel.java:1251)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at android.os.Parcel.readException(Parcel.java:1235)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.google.android.gms.internal.x$a$a.a(Unknown Source)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:192)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:217)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:836)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:412)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:345)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:463)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.me.gameapp.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:262)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at com.me.gameapp.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:1)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): at java.lang.Thread.run(Thread.java:1096)
04-03 13:38:42.786: I/com.me.gameapp.LoginActivity$UserLoginTask(11255): Leave doInBackground with false
在Exception received from server at https://1.myapp.appspot.com/_ah/api/
行中,我正在运行localhost上的所有内容。也许https://1.myapp.appspot.com/_ah/api/
错了。我的代码非常接近模板,所以我不确定这是我所做的改变。
答案 0 :(得分:12)
此处引用的名称是选定的帐户名称,而不是应用程序名称。
同样在Android 6.0 上,您需要在调用Google端点之前获得通讯录权限。否则,即使您使用
设置帐户名称credential.setSelectedAccountName(accountName);
您仍会收到上述异常。
答案 1 :(得分:6)
在为我自己测试时出现了类似的错误消息,为我解决的问题是使用
跑步前credential.setSelectedAccountName( “user@gmail.com”);
SomeAbstractGoogleJsonClient.Builder builder = new SomeAbstractGoogleJsonClient.Builder(
AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential);
假设您的应用中存在类似的代码。由于您只是从调用者线程发布了片段,因此很难说。
答案 2 :(得分:2)
我的解决方案是使用
def convert_celsius_fahrenheit(celsius_value):
return 9 / 5 * celsius_value + 32
def print_fahrenheit_value(celsius_value, fahrenheit_value):
print("Centigrade temperature :", celsius_value)
print("fahrenheit temperature :", fahrenheit_value)
所以我使用credential.setSelectedAccount(new Account(settings.getString(Constants.PREF_ACCOUNT_NAME, null), "com.example.myapplication"));
代替setSelectedAccount
答案 3 :(得分:1)
也许是一个远景,但也许是抱怨它为null的'名称'是应用程序名称?
为了创建服务,我最终得到了像这样的代码
HttpTransport transport = AndroidHttp.newCompatibleTransport();
JsonFactory jsonFactory = new JacksonFactory();
Nviewendpoint.Builder builder = new Nviewendpoint.Builder( transport, jsonFactory, null );
builder.setApplicationName( appName );
请注意,我添加了'setApplicationName'(相对于我找到的示例)。
答案 4 :(得分:1)
设置accountname对我来说不起作用,我必须设置selectedaccount,因为marco说。为了简化他的答案
credential = GoogleAccountCredential.usingOAuth2(context, scopes);
credential.setSelectedAccount(new Account("developer@gmail.com", "com.your.pakagename"));
答案 5 :(得分:0)
在上面添加Vikas的答案 -
从Android 6.0(API级别23)开始,用户在应用运行时向应用授予权限,而不是在安装应用时授予权限。
这实际上取决于您所寻求的许可类型。对于Dangerous权限和权限组,您需要在运行时请求权限,并且仅在清单中指定它是不够的。
要查看危险权限和群组 - https://developer.android.com/guide/topics/security/permissions.html#perm-groups
正如您所见,联系人就是其中之一 -
要解决此问题,您需要在运行时请求权限。怎么做? - https://developer.android.com/training/permissions/requesting.html