- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我通过单击 Button
请求获取用户个人资料信息。我进行了调试,当我刚刚打开应用程序并单击按钮 onError
回调时,它显示“无效的用户 ID”。如果我第二次按 Button
它工作正常。从实验中我了解到应用程序没有完成授权,这就是请求被拒绝的原因。通过按下 Button
使用此代码调用方法:
VKSdk.authorize(VKScopes.EMAIL);
VKRequest request = VKApi.users().get(VKParameters.from(VKApiConst.FIELDS,
"user_id,first_name,last_name,sex,bdate,city,photo_200_orig"));
request.secure = false;
request.useSystemLanguage = true;
request.executeWithListener(new VKRequest.VKRequestListener() {
@Override
public void onComplete(VKResponse response) {
super.onComplete(response);
//do some stuff
}
@Override
public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) {
super.attemptFailed(request, attemptNumber, totalAttempts);
Log.d("VkDemoApp", "attemptFailed " + request + " " + attemptNumber + " " + totalAttempts);
}
@Override
public void onError(VKError error) {
super.onError(error);
Log.d("VkDemoApp", "onError: " + error);
}
@Override
public void onProgress(VKRequest.VKProgressType progressType, long bytesLoaded, long bytesTotal) {
super.onProgress(progressType, bytesLoaded, bytesTotal);
Log.d("VkDemoApp", "onProgress " + progressType + " " + bytesLoaded + " " + bytesTotal);
}
});
我尝试添加 if(VKSdk.wakeUpSession())
,但它只是通过了,因为用户尚未获得授权。我在示例回调 onTokenExpired
中发现作为 listener
的一部分,如果需要我会在其中授权用户,但是当我添加它时说“从未使用过”。
我如何才能等到 VKSdk.authorize()
完成工作并仅在发送请求之后?提前致谢!
编辑
这是 onCreate()
中的行
VKSdk.initialize(sdkListener, activity.getResources().getString(R.string.vk_app_id));
VKUIHelper.onCreate(this);
VKSdkListener
VKSdkListener sdkListener = new VKSdkListener() {
@Override
public void onAcceptUserToken(VKAccessToken token) {
}
@Override
public void onReceiveNewToken(VKAccessToken newToken) {
//requesting the code at the top (request)
//excluding the line VKSdk.authorize(VKScopes.EMAIL);
}
@Override
public void onRenewAccessToken(VKAccessToken token) {
}
@Override
public void onCaptchaError(VKError vkError) {
}
@Override
public void onTokenExpired(VKAccessToken vkAccessToken) {
}
@Override
public void onAccessDenied(VKError vkError) {
}
};
在 onClick()
中有一行 VKSdk.authorize(VKScopes.EMAIL);
注意 VkSdkListener 的回调不是在initialize()
之后调用,而是在authorize()
之后调用。我不知道为什么,这种行为很糟糕。很高兴看到包含已获取用户的电子邮件和上面列出的其他内容的工作示例。
最佳答案
我可能是错的,但请尝试将“user_id”更改为“id”。第二个问题(授权后如何获取数据)的答案很简单。VKsdk 有一个带有抽象方法的监听器,您可以(并且应该)覆盖这些方法。
编辑
private static final String[] sVkontakteScopes = new String[]{
VKScope.FRIENDS,
VKScope.PHOTOS,
VKScope.NOHTTPS,
};
private VKSdkListener mVkontakteLoginListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, persistentState);
mVkontakteLoginListener = new VKSdkListener() {
@Override
public void onCaptchaError(VKError captchaError) {
new VKCaptchaDialog(captchaError).show(VkApiActivity.this);
}
@Override
public void onTokenExpired(VKAccessToken expiredToken) {
VKSdk.authorize(sVkontakteScopes);
}
@Override
public void onAccessDenied(VKError authorizationError) {
new AlertDialog.Builder(VKUIHelper.getTopActivity())
.setMessage(authorizationError.toString())
.show();
}
@Override
public void onReceiveNewToken(VKAccessToken newToken) {
//put your method here
makeYourStuff();
PrefUtils.storeVkontakteAccessToken(newToken.accessToken);
}
@Override
public void onAcceptUserToken(VKAccessToken token) {
//put your method here
makeYourStuff();
}
@Override
public void onRenewAccessToken(VKAccessToken token) {
//put your method here
makeYourStuff();
}
};
if (PrefUtils.getVkontakteAccessToken() != null)
VKSdk.initialize(mVkontakteLoginListener, getString(R.string.vkontakte_app_id, PrefUtils.getVkontakteAccessToken()));
else {
VKSdk.initialize(mVkontakteLoginListener, getString(R.string.vkontakte_app_id));
}
VKUIHelper.onCreate(this);
}
private void makeYourStuff() {
VKParameters params = new VKParameters();
params.put(VKApiConst.FIELDS, "id,first_name,last_name, photo_100");
VKRequest request = new VKRequest("users.get", params);
request.executeWithListener(new VKRequest.VKRequestListener() {
@Override
public void onComplete(VKResponse response) {
super.onComplete(response);
JSONArray jsonArray;
String firstName, lastName, id, photoUrl;
try {
jsonArray = response.json.getJSONArray("response");
JSONObject userObject = jsonArray.getJSONObject(0);
firstName = userObject.getString("first_name");
lastName = userObject.getString("last_name");
id = userObject.getString("id");
photoUrl = userObject.getString("photo_100");
/*
here you can start another activity or fragment
put this info into bundle or store into database
*/
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(VKError error) {
super.onError(error);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
VKUIHelper.onActivityResult(this, requestCode, resultCode, data);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btnLogin) {
VKSdk.authorize(sVkontakteScopes);
// after this method will be called your one of your VKSdkListener methods
// you should put your request method all three SUCCESS methods of VKSdk listener
}
}
关于android - VKSdk.authorize() 后的 VKRequest 抛出错误 "invalid user id"。相继?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29940841/
我通过单击 Button 请求获取用户个人资料信息。我进行了调试,当我刚刚打开应用程序并单击按钮 onError 回调时,它显示“无效的用户 ID”。如果我第二次按 Button 它工作正常。从实验中
我是一名优秀的程序员,十分优秀!