6

Phương pháp endpoint trông như thế này:phương pháp endpoint Google tiếp tục trở về "Tên không được bỏ trống" ngoại lệ

@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"); 
    } 
} 

Đoạn từ ngoại hình android như thế này:

@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; 
} 

Calling reg.execute() giữ ném ngoại lệ:

java.lang.IllegalArgumentException: the name must not be empty: null 

Từ bảng điều khiển máy chủ, nó thậm chí không giống l ike máy chủ đang bị tấn công. Ngay cả khi tôi cố gắng chạy máy chủ trong chế độ gỡ lỗi, điểm ngắt của tôi (dòng đầu tiên bên trong phương thức) không được tiếp cận.

EDIT: thêm stack trace:

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 

Trong dòng Exception received from server at https://1.myapp.appspot.com/_ah/api/, tôi chạy tất cả mọi thứ trên localhost. Có thể https://1.myapp.appspot.com/_ah/api/ là sai. Mã của tôi là rất gần với các mẫu, mặc dù, vì vậy tôi không chắc chắn đó là một sự thay đổi tôi cam kết.

+0

Bạn có thể chia sẻ theo dõi ngăn xếp đầy đủ không? Tôi nghi ngờ có lỗi trong mã Android của bạn. –

+0

@DanHolevoet Tôi đã thêm dấu vết ngăn xếp. – learner

+0

Ngoài ra, tôi có thể nhấn máy chủ thông qua trình khám phá api; nhưng không thông qua mã Android. – learner

Trả lời

1

Longshot có lẽ, nhưng có thể là 'tên' mà nó đang phàn nàn về null là tên ứng dụng?

Đối với việc tạo ra các dịch vụ tôi đã kết thúc với mã như thế này

HttpTransport transport = AndroidHttp.newCompatibleTransport(); 
JsonFactory jsonFactory = new JacksonFactory(); 

Nviewendpoint.Builder builder = new Nviewendpoint.Builder(transport, jsonFactory, null); 
builder.setApplicationName(appName); 

Lưu ý rằng tôi đã thêm các 'setApplicationName' (so với các ví dụ tôi tìm thấy).

+0

+1 cho ảnh dài. Nhưng điều đó không làm được. – learner

6

Đã có một thông báo lỗi tương tự khi thử nghiệm này ra cho bản thân mình, những gì giải quyết nó cho tôi đã sử dụng

credential.setSelectedAccountName ("[email protected]");

trước khi chạy

SomeAbstractGoogleJsonClient.Builder builder = new SomeAbstractGoogleJsonClient.Builder(
AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential); 

giả mã tương tự là ở đâu đó trong ứng dụng của bạn. Vì bạn chỉ đăng đoạn trích từ chuỗi người gọi của mình nên thật khó để nói.

+0

Điều đó đã giúp tôi! Cảm ơn! – nhaarman

9

Ở đây, tên được gọi là tên tài khoản đã chọn, không phải tên ứng dụng.

Cũng trên android 6.0 bạn cần nhận quyền Danh bạ trước khi bạn gọi các điểm cuối của google. Nếu không, ngay cả khi bạn đặt tên tài khoản bằng cách sử dụng

credential.setSelectedAccountName(accountName); 

Bạn vẫn sẽ nhận được ngoại lệ được đề cập ở trên.

+0

Và điều này được thực hiện chính xác như thế nào? –

+0

Cảm ơn, thông tin này 'đã lưu' cuộc sống của tôi sau rất nhiều thời gian tìm kiếm Quyền liên lạc ngu ngốc !!!!!! cảm ơn bạn – user2582318

0

Thêm vào câu trả lời của Vikas trên -

Bắt đầu từ Android 6.0 (cấp API 23), người dùng cấp quyền truy cập vào các ứng dụng trong khi các ứng dụng đang chạy, không phải khi họ cài đặt ứng dụng.

Nó thực sự phụ thuộc vào loại quyền bạn đang tìm kiếm. Đối với nhóm quyền và quyền hạn nguy hiểm, bạn cần xin phép khi chạy và chỉ định nó trong tệp kê khai là không đủ.

Để xem điều khoản nguy hiểm và các nhóm - https://developer.android.com/guide/topics/security/permissions.html#perm-groups

Như bạn thấy LIÊN HỆ là một trong số họ -

  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS

Để sửa lỗi này bạn cần xin phép khi chạy. Làm thế nào để làm điều đó? - https://developer.android.com/training/permissions/requesting.html

1

Giải pháp của tôi là sử dụng

credential.setSelectedAccount(new Account(settings.getString(Constants.PREF_ACCOUNT_NAME, null), "com.example.myapplication")); 

Vì vậy, tôi sử dụng setSelectedAccount thay vì setSelectedAccountName

0

Setting têntàikhoản không làm việc cho tôi, tôi đã phải thiết lập selectedaccount như marco nói. Để đơn giản hóa câu trả lời của mình

credential = GoogleAccountCredential.usingOAuth2(context, scopes); 
    credential.setSelectedAccount(new Account("[email protected]", "com.your.pakagename")); 
Các vấn đề liên quan