android - VKRequest after VKSdk.authorize() throws error "invalid user id". One after another? -
i make request user profile info clicking button. debugged , when opened app , clicked on button onerror callback worked , said "invalid user id". if press button second time works fine. experiments understood app didn't complete authorization, that's why request denied. pressing button calls method code:
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 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); } }); i tried add if(vksdk.wakeupsession()) , passed through, cuz user not authorized yet. found in example callback ontokenexpired part of listener, i'll authorize user if needed, when added said "is never used".
how can wait until vksdk.authorize() finish working , after send request? in advance!
edit
this line in 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 code @ top (request) //excluding 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) { } }; and in onclick() there line vksdk.authorize(vkscopes.email);
note vksdklistener's callbacks not being called after initialize(), called after authorize(). don't know why, behavior of awful. great see working example gotten user's email , other things listed above.
i wrong, try change "user_id" "id". answer second question (how fetch data after authorize) simple. vksdk has listener abstract methods (and should) override.
edit
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 method here makeyourstuff(); prefutils.storevkontakteaccesstoken(newtoken.accesstoken); } @override public void onacceptusertoken(vkaccesstoken token) { //put method here makeyourstuff(); } @override public void onrenewaccesstoken(vkaccesstoken token) { //put 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 can start activity or fragment put info bundle or store 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 method called 1 of vksdklistener methods // should put request method 3 success methods of vksdk listener } }
Comments
Post a Comment