java - Context with BackgroundTask and Facebook -
i have problem android application. if access "app account" it's ok.
otherwise if access facebook account credential, context null.
how solve this?
below code. thank in advance.
login.java :
public class login extends appcompatactivity { context ctx; private loginbutton loginbuttonfb; private textview info; private callbackmanager callbackmanager; edittext et_name, et_pass; string login_name, login_pass; static final string username = "user_name"; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); facebooksdk.sdkinitialize(getapplicationcontext()); setcontentview(r.layout.activity_login); callbackmanager = callbackmanager.factory.create(); loginbuttonfb = (loginbutton)findviewbyid(r.id.login_button_fb); loginbuttonfb.setreadpermissions("user_friends"); et_name = (edittext) findviewbyid(r.id.user_name); et_pass = (edittext) findviewbyid(r.id.user_pass); info = (textview)findviewbyid(r.id.info); loginbuttonfb.registercallback(callbackmanager, new facebookcallback<loginresult>() { @override public void onsuccess(loginresult loginresult) { new graphrequest( accesstoken.getcurrentaccesstoken(), loginresult.getaccesstoken().getuserid(), null, httpmethod.get, new graphrequest.callback() { public void oncompleted(graphresponse response) { try { jsonobject data = response.getjsonobject(); string idfb = data.getstring("id"); string namefb = data.getstring("name"); string method = "loginfb"; backgroundtask backgroundtask = new backgroundtask(ctx); backgroundtask.execute(method, namefb, idfb); } catch (jsonexception e) { e.printstacktrace(); } } } ).executeasync(); } @override public void oncancel() { info.settext("login attempt canceled."); } @override public void onerror(facebookexception e) { info.settext("login attempt failed."); } }); } @override protected void onactivityresult(int requestcode, int resultcode, intent data) { callbackmanager.onactivityresult(requestcode, resultcode, data); } public void userreg(view view){ intent intent = new intent(this, registration.class); startactivity(intent); } private class backgroundtask extends asynctask<string, void, string> { context ctx; backgroundtask(context ctx){ this.ctx = ctx; } @override protected string doinbackground(string... params) { string method = params[0]; if (method.equals("login")){ string login_url = "http://192.168.1.118:80/webappdb/login.php"; string login_name = params[1]; string login_pass = params[2]; try { url url = new url(login_url); httpurlconnection httpurlconnection = (httpurlconnection) url.openconnection(); httpurlconnection.setrequestmethod("post"); httpurlconnection.setdooutput(true); httpurlconnection.setdoinput(true); outputstream outputstream = httpurlconnection.getoutputstream(); bufferedwriter bufferedwriter = new bufferedwriter(new outputstreamwriter(outputstream, "utf-8")); string data = urlencoder.encode("login_name", "utf-8") + "=" + urlencoder.encode(login_name, "utf-8") + "&" + urlencoder.encode("login_pass", "utf-8") + "=" + urlencoder.encode(login_pass, "utf-8"); bufferedwriter.write(data); bufferedwriter.flush(); bufferedwriter.close(); outputstream.close(); inputstream inputstream = httpurlconnection.getinputstream(); bufferedreader bufferedreader = new bufferedreader((new inputstreamreader(inputstream, "iso-8859-1"))); string response = ""; string line = ""; while((line = bufferedreader.readline()) != null){ response += line; } bufferedreader.close(); inputstream.close(); httpurlconnection.disconnect(); return response; } catch (malformedurlexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } else if(method.equals("loginfb")){ string login_name = params[1]; string id = params[2]; string loginfb_url = "http://192.168.1.118:80/webappdb/loginfb.php"; try { url url = new url(loginfb_url); httpurlconnection httpurlconnection = (httpurlconnection) url.openconnection(); httpurlconnection.setrequestmethod("post"); httpurlconnection.setdooutput(true); httpurlconnection.setdoinput(true); outputstream outputstream = httpurlconnection.getoutputstream(); bufferedwriter bufferedwriter = new bufferedwriter(new outputstreamwriter(outputstream, "utf-8")); string data = urlencoder.encode("login_namefb", "utf-8") + "=" + urlencoder.encode(login_name, "utf-8") + "&" + urlencoder.encode("id", "utf-8") + "=" + urlencoder.encode(id, "utf-8"); bufferedwriter.write(data); bufferedwriter.flush(); bufferedwriter.close(); outputstream.close(); inputstream inputstream = httpurlconnection.getinputstream(); bufferedreader bufferedreader = new bufferedreader((new inputstreamreader(inputstream, "iso-8859-1"))); string response = ""; string line = ""; while((line = bufferedreader.readline()) != null){ response += line; } bufferedreader.close(); inputstream.close(); httpurlconnection.disconnect(); return response; } catch (malformedurlexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } return null; } @override protected void onpostexecute(string result) { if(result.equals("login failed, try again.")){ toast.maketext(ctx, result, toast.length_long).show(); } if (result.equals("login success!")){ intent intent = new intent(ctx,userprofile.class); intent.putextra(username, login_name); startactivity(intent); toast.maketext(ctx, result, toast.length_long).show(); } } } public void userlogin(view view){ login_name = et_name.gettext().tostring(); login_pass = et_pass.gettext().tostring(); string method = "login"; backgroundtask backgroundtask = new backgroundtask(this); backgroundtask.execute(method, login_name, login_pass); } } stack trace:
gamingproject.sellmybooks e/androidruntime: fatal exception: main process: gamingproject.sellmybooks, pid: 30637 java.lang.nullpointerexception: attempt invoke virtual method 'java.lang.string android.content.context.getpackagename()' on null object reference @ android.content.componentname.<init>(componentname.java:77) @ android.content.intent.<init>(intent.java:4144) @ gamingproject.sellmybooks.login$backgroundtask.onpostexecute(login.java:228) @ gamingproject.sellmybooks.login$backgroundtask.onpostexecute(login.java:123) @ android.os.asynctask.finish(asynctask.java:632) @ android.os.asynctask.access$600(asynctask.java:177) @ android.os.asynctask$internalhandler.handlemessage(asynctask.java:645) @ android.os.handler.dispatchmessage(handler.java:102) @ android.os.looper.loop(looper.java:135) @ android.app.activitythread.main(activitythread.java:5536) @ java.lang.reflect.method.invoke(native method) @ java.lang.reflect.method.invoke(method.java:372) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1397) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:1192)
on login activity, change 'context ctx' 'context mcontext' , when oncreate() starts, do
mcontext = this; like that:
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mcontext = this; ... } on method userlogin, send 'mcontext'
public void userlogin(view view){ login_name = et_name.gettext().tostring(); login_pass = et_pass.gettext().tostring(); string method = "login"; backgroundtask backgroundtask = new backgroundtask(mcontext); backgroundtask.execute(method, login_name, login_pass); }
Comments
Post a Comment