Probleme mit Facebook SDK

  • Antworten:37
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 71

28.02.2014, 15:42:32 via Website

Hallo Leute, ich hab ein bzw. eigentlich gleich 2 Probleme,
Erstmal zur kurzen Erklärung: ich bin grade dabei, Facebook in mein App einzubauen, man soll nämlich seinen Highscore letztendlich dann über das App auf die Pinnwand posten können. Aber soweit bin ich (leider) noch gar nicht. Ich bin jetzt eigentlich grade dabei, Benutzerdaten auszulesen und dann einen Text mit: Welcome xxx.xxx auszugeben (xxx steht für name) und das profilbild anzuzeigen.. Allerdings wird gar nichts angezeigt. Was komisch ist: ich habe noch eine weitere TextView um den Highscore auszugeben, und habe die mal zum Testen missbraucht und habe einfach versucht, einen beliebigen Text auszugeben, zum einen, in dem Teil des Programms, wo man sich einloggt, hat funktioniert. Aber als ich es dann in der Funktion versucht habe, wo der Login Button nach dem Login dann zum Logout button wird und eine Funktion zur Datenerfassung aufgerufen wird, ging es plötzlich nicht mehr. Warum auch immer (ich werde es nachher im Quelltext markieren, was ich mein). Was aber komisch ist(!!): Die Daten werden prinzipiell auf jeden Fall erfasst, denn ich habe mal in Logcat nachgeschaut, und da wurden mir bei einem Eintrag sämtliche Daten wie Name, Email, ID usw. angezeigt, allerdings habe ich dann versucht, genau zwischendrin (wo auch die Daten erfasst werden) auch einfach mal auf dieser Highscore-TextView etwas auszugeben, und siehe da: GAR NICHTS.... Das war also Problem Nr.1 ich hoff mir kann jemand helfen.

Zu Problem Nummer 2: der Logout....
Einloggen funktioniert problemlos (bis auf das obige Problem) aber sobald ich dann auf Logout drücke, stürzt die App ab. Ich habe schon unzählige Möglichkeiten versucht, wie:
1Session session = Session.getActiveSession();
2 if (!session.isClosed()) {
3 session.closeAndClearTokenInformation();
4 }
oder
1fb.logout(ScoreActivity.this)
oder auch schonn mit dem AsyncFacebookRunner.logout und diverse andere Möglichkeit (mit Acitvity name, ohne Name und was weiß ich was alles) und ich weiß mir einfach nicht mehr zu helfen... Info am Rande: ich benutze die Facebook Android SDK 3.7
Ich bin echt langsam am verzweifeln und weiß nicht mehr was ich noch alles ausprobieren soll...
Hier also noch mein Quelltext (ich hoffe man findet sich halbwegs zurecht, hab ein paar Funktionen ausgelassen, die jetzt unwesentlich sind)

1public class ScoreActivity extends Activity implements OnClickListener {
2 TextView anzeigen;
3
4 ImageView pic, button;
5 Facebook fb;
6 TextView welcome;
7 Session session;
8
9 JSONObject obj = null;
10 URL img_url = null;
11
12 public static AsyncFacebookRunner mAsyncRunner = null;
13
14 SharedPreferences sp;
15
16 @Override
17 protected void onCreate(Bundle savedInstanceState) {
18 requestWindowFeature(Window.FEATURE_NO_TITLE);
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.score);
21
22 String APP_ID = getString(R.string.app_id);
23 fb = new Facebook(APP_ID);
24
25 mAsyncRunner = new AsyncFacebookRunner(fb);
26
27 welcome = (TextView) findViewById(R.id.welcome);
28
29 sp = getPreferences(MODE_PRIVATE);
30 String access_token = sp.getString("access_token", null);
31 long expires = sp.getLong("access_expires", 0);
32
33 if (access_token != null) {
34 fb.setAccessToken(access_token);
35 }
36 if (expires != 0) {
37 fb.setAccessExpires(expires);
38 }
39
40 button = (ImageView) findViewById(R.id.login);
41 pic = (ImageView) findViewById(R.id.picture_pic);
42 button.setOnClickListener(this);
43 updateButtonImage();
44 init(); // (unwichtig)
45
46
47 }
48
49 private void updateButtonImage() {
50 // TODO Auto-generated method stub
51 if (fb.isSessionValid()) { //wenn eingeloggt
52 button.setImageResource(R.drawable.logout_button);
53 pic.setVisibility(ImageView.VISIBLE);
54 getProfileInformation();
55
56 } else { //wenn ausgeloggt
57 button.setImageResource(R.drawable.login_button);
58 pic.setVisibility(ImageView.INVISIBLE);
59 }
60 }
61
62 public void getProfileInformation() {
63
64 //wenn ich hier den Text der TextView in einen beliebigen Text ändere funktioniert es komischerweise nicht, obwohl die Aktionen darunter denke ich eigentlich ausgeführt werden
65
66 mAsyncRunner.request("me", new RequestListener() {
67 public void onComplete(String response, Object state) {
68 Log.d("Profile", response);
69 String json = response;
70 try {
71 JSONObject profile = new JSONObject(json);
72 // getting name of the user
73 final String name = profile.getString("name");
74 // getting email of the user
75 final String email = profile.getString("email");
76 // getting email of the user
77 final String id = profile.getString("id");
78
79 img_url=new URL("http://graph.facebook.com/"+id+"/pictrue=type=normal");
80 Bitmap bmp = BitmapFactory.decodeStream(img_url.openConnection().getInputStream());
81 pic.setImageBitmap(bmp);
82 welcome.setText("Welcome " + name);
83
84
85
86 } catch (JSONException e) {
87 e.printStackTrace();
88
89 } catch (MalformedURLException e) {
90 // TODO Auto-generated catch block
91 e.printStackTrace();
92
93 } catch (IOException e) {
94 // TODO Auto-generated catch block
95 e.printStackTrace();
96 }
97 }
98
99 public void onIOException(IOException e, Object state) {
100 }
101
102 public void onFileNotFoundException(FileNotFoundException e,
103 Object state) {
104 }
105
106 public void onMalformedURLException(MalformedURLException e,
107 Object state) {
108 }
109
110 public void onFacebookError(FacebookError e, Object state) {
111 }
112 });
113
114 }
115@Override
116 public void onClick(View v) {
117 if (fb.isSessionValid()) {
118 Session session = Session.getActiveSession(); //hier soll der Logout-Vorgang passieren
119 if (!session.isClosed()) {
120 session.closeAndClearTokenInformation();
121 }
122 updateButtonImage();
123 } else {
124 // login to facebook --> funktioniert
125 fb.authorize(ScoreActivity.this, new String[] { "email" },
126 new DialogListener() {
127 @Override
128 public void onFacebookError(FacebookError e) {
129 // TODO Auto-generated method stub
130 Toast.makeText(ScoreActivity.this, "fbError",
131 Toast.LENGTH_SHORT).show();
132 }
133
134 @Override
135 public void onError(DialogError e) {
136 // TODO Auto-generated method stub
137 Toast.makeText(ScoreActivity.this, "onError",
138 Toast.LENGTH_SHORT).show();
139 }
140
141 @Override
142 public void onComplete(Bundle values) {
143 // TODO Auto-generated method stub
144 Editor editor = sp.edit();
145 editor.putString("access_token",
146 fb.getAccessToken());
147 editor.putLong("access_expires",
148 fb.getAccessExpires());
149 editor.commit();
150 updateButtonImage();
151
152 //wenn ich hier den Text der Highscore-TextView (hier: anzeigen) ändere funktioniert es!
153 }
154
155 @Override
156 public void onCancel() {
157 // TODO Auto-generated method stub
158 Toast.makeText(ScoreActivity.this, "onCancel",
159 Toast.LENGTH_SHORT).show();
160 }
161 });
162
163 }
164 }
165
166 @Override
167 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
168 // TODO Auto-generated method stub
169 super.onActivityResult(requestCode, resultCode, data);
170 fb.authorizeCallback(requestCode, resultCode, data);
171 }
172}



Also wie gesagt, über schnelle Hilfe wäre ich echt dankbar!!

Mit freundlichen Grüßen
Florian S.



Ps: hier auch noch die Logcat-Ausgabe von der ich zumindest schwer davon ausgehe, dass da der Inhalt der Funktion getProfileinformation() ausgeführt wird (leider kenn ich mich mit Logcat gar nicht aus... (Namen und Ids durch sterne ersetzt)

02-28 15:39:22.423: D/Profile(26091): {"id":"1000*******","name":"Florian S********","first_name":"Florian","last_name":"S*******","link":"https:\/\/www.facebook.com\/florian.s********","gender":"male","email":"frab*********eb.de","timezone":1,"locale":"de_DE","verified":true,"updated_time":"2013-10-05T06:18:11+0000","username":"florian.s********"}

Antworten
  • Forum-Beiträge: 71

01.03.2014, 08:12:52 via App

Hab ich jetzt mit meinem halben Roman alle erschlagen? Weiß keiner worans liegt?

Antworten
Klaus
  • Blogger
  • Forum-Beiträge: 19.169

01.03.2014, 08:34:09 via App

Hallo!

Bitte nicht pushen, gib doch der Community ein wenig Zeit!

Wenn sich jemand findet, der eine Antwort zu deiner Frage weiß, dann wird er/sie es bestimmt hier posten, also hab noch ein wenig Geduld... :wacko:

| LG Klaus |
| Google Nexus 6P - Dirty Unicorns | Google Nexus 6 - Dirty Unicorns |
| Das AndroidPITiden-Buch | Die Androiden-Toolbox | AndroidPIT-Regeln |

Antworten
  • Forum-Beiträge: 11.223

01.03.2014, 08:42:09 via Website

Dein LogCat zeigt zwar die Login Daten an aber kein konkreten Fehler oder eine Exception.
Bitte nochmal überprüfen (Rote Texte sind immer Errors etc.) und ggf posten

— geändert am 01.03.2014, 08:42:20

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 71

02.03.2014, 10:14:37 via Website

Also, Logcat zeigt beim Klick auf Logout jetzt folgendes an (bei den Errors):
03-02 10:06:56.010: E/AudioPolicyService(1849): getOutput() tid 4136 --
03-02 10:06:56.550: E/SpannableStringBuilder(21637): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-02 10:06:56.550: E/SpannableStringBuilder(21637): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-02 10:06:59.520: E/Watchdog(7266): !@Sync 16593
03-02 10:07:02.095: E/dalvikvm(21753): Could not find class 'android.telephony.CellInfoCdma', referenced from method com.facebook.common.hardware.CellDiagnosticsSerializer.c
03-02 10:07:03.710: E/SpannableStringBuilder(21637): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-02 10:07:03.710: E/SpannableStringBuilder(21637): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-02 10:07:04.450: E/dalvikvm(29171): Could not find class 'android.app.AppOpsManager', referenced from method bln.a
03-02 10:07:04.735: E/AndroidRuntime(21637): FATAL EXCEPTION: Thread-40029
03-02 10:07:04.735: E/AndroidRuntime(21637): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-02 10:07:04.735: E/AndroidRuntime(21637): at android.os.Handler.<init>(Handler.java:121)
03-02 10:07:04.735: E/AndroidRuntime(21637): at android.widget.Toast$TN.<init>(Toast.java:361)
03-02 10:07:04.735: E/AndroidRuntime(21637): at android.widget.Toast.<init>(Toast.java:97)
03-02 10:07:04.735: E/AndroidRuntime(21637): at android.widget.Toast.makeText(Toast.java:254)
03-02 10:07:04.735: E/AndroidRuntime(21637): at de.ftProductions.volcanoJump.ScoreActivity$1.onComplete(ScoreActivity.java:135)
03-02 10:07:04.735: E/AndroidRuntime(21637): at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:276)
03-02 10:07:05.095: E/android.os.Debug(7266): !@Dumpstate > dumpstate -k -t -z -d -o /data/log/dumpstate_app_error
03-02 10:07:17.870: E/WifiHW(7266): ##################### set firmware type 0 #####################
03-02 10:07:17.955: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=0, widgetID:1
03-02 10:07:17.960: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : ItemIndex exceed ListItemCount. itemIndex=1
03-02 10:07:17.960: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=1, widgetID:1
03-02 10:07:20.135: E/ObjectHelper(21886): Can't find method:setCompatibilityInfo
03-02 10:07:20.950: E/ActivityThread(21872): Failed to find provider info for com.seven.provider.email
03-02 10:07:22.655: E/MtpService(21005): In MTPAPP onReceive:android.intent.action.BATTERY_CHANGED
03-02 10:07:22.655: E/MtpService(21005): battPlugged Type : 2
03-02 10:07:22.930: E/WifiHW(7266): ##################### set firmware type 0 #####################
03-02 10:07:29.525: E/Watchdog(7266): !@Sync 16594
03-02 10:07:29.965: E/SensorManager(27707): thread start
03-02 10:07:30.560: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=0, widgetID:1
03-02 10:07:30.565: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : ItemIndex exceed ListItemCount. itemIndex=1
03-02 10:07:30.565: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=1, widgetID:1
03-02 10:07:59.525: E/Watchdog(7266): !@Sync 16595
03-02 10:08:00.060: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=0, widgetID:1
03-02 10:08:00.060: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : ItemIndex exceed ListItemCount. itemIndex=1
03-02 10:08:00.060: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=1, widgetID:1
03-02 10:08:02.750: E/MtpService(21005): In MTPAPP onReceive:android.intent.action.BATTERY_CHANGED
03-02 10:08:02.750: E/MtpService(21005): battPlugged Type : 2
03-02 10:08:17.965: E/WifiHW(7266): ##################### set firmware type 0 #####################
03-02 10:08:22.555: E/WifiHW(7266): ##################### set firmware type 0 #####################
03-02 10:08:29.525: E/Watchdog(7266): !@Sync 16596
03-02 10:08:42.845: E/MtpService(21005): In MTPAPP onReceive:android.intent.action.BATTERY_CHANGED
03-02 10:08:42.845: E/MtpService(21005): battPlugged Type : 2
03-02 10:08:59.530: E/Watchdog(7266): !@Sync 16597
03-02 10:09:00.060: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=0, widgetID:1
03-02 10:09:00.060: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : ItemIndex exceed ListItemCount. itemIndex=1
03-02 10:09:00.060: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=1, widgetID:1


Ich habe jetzt bei den Catch blöcken nichts in Log geschrieben, sondern einfach ne Toast-Message gemacht (kam aber keine am Handy..)

1public void getProfileInformation() {
2
3 mAsyncRunner.request("me", new RequestListener() {
4 public void onComplete(String response, Object state) {
5 Log.d("Profile", response);
6 String json = response;
7 try {
8 JSONObject profile = new JSONObject(json);
9 // getting name of the user
10 final String name = profile.getString("name");
11 // getting email of the user
12 final String email = profile.getString("email");
13 // getting email of the user
14 final String id = profile.getString("id");
15
16 img_url=new URL("http://graph.facebook.com/"+id+"/pictrue=type=normal");
17 Bitmap bmp = BitmapFactory.decodeStream(img_url.openConnection().getInputStream());
18 pic.setImageBitmap(bmp);
19 welcome.setText("Welcome " + name);
20
21
22
23 } catch (JSONException e) {
24 e.printStackTrace();
25 Toast.makeText(ScoreActivity.this, "JsonFehler",
26 Toast.LENGTH_SHORT).show();
27
28 } catch (MalformedURLException e) {
29 // TODO Auto-generated catch block
30 e.printStackTrace();
31 Toast.makeText(ScoreActivity.this, "urlError",
32 Toast.LENGTH_SHORT).show();
33
34 } catch (IOException e) {
35 // TODO Auto-generated catch block
36 Toast.makeText(ScoreActivity.this, "ioerror",
37 Toast.LENGTH_SHORT).show();
38 e.printStackTrace();
39 }
40 }
41
42 public void onIOException(IOException e, Object state) {
43 Toast.makeText(ScoreActivity.this, "onioError",
44 Toast.LENGTH_SHORT).show();
45 }
46
47 public void onFileNotFoundException(FileNotFoundException e,
48 Object state) {
49 Toast.makeText(ScoreActivity.this, "filenotfoundError",
50 Toast.LENGTH_SHORT).show();
51 }
52
53 public void onMalformedURLException(MalformedURLException e,
54 Object state) {
55 Toast.makeText(ScoreActivity.this, "onurlError",
56 Toast.LENGTH_SHORT).show();
57 }
58
59 public void onFacebookError(FacebookError e, Object state) {
60 Toast.makeText(ScoreActivity.this, "fbError",
61 Toast.LENGTH_SHORT).show();
62 }
63 });
64
65 }

hier jetzt noch die Logcat Ausgabe bei dem Login (wo die Daten ausgegeben werden sollen:

03-02 10:12:00.165: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=1, widgetID:1
03-02 10:12:03.740: E/MtpService(21005): In MTPAPP onReceive:android.intent.action.BATTERY_CHANGED
03-02 10:12:03.740: E/MtpService(21005): battPlugged Type : 2
03-02 10:12:04.780: E/AndroidRuntime(22551): FATAL EXCEPTION: Thread-40114
03-02 10:12:04.780: E/AndroidRuntime(22551): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-02 10:12:04.780: E/AndroidRuntime(22551): at android.os.Handler.<init>(Handler.java:121)
03-02 10:12:04.780: E/AndroidRuntime(22551): at android.widget.Toast$TN.<init>(Toast.java:361)
03-02 10:12:04.780: E/AndroidRuntime(22551): at android.widget.Toast.<init>(Toast.java:97)
03-02 10:12:04.780: E/AndroidRuntime(22551): at android.widget.Toast.makeText(Toast.java:254)
03-02 10:12:04.780: E/AndroidRuntime(22551): at de.ftProductions.volcanoJump.ScoreActivity$1.onComplete(ScoreActivity.java:135)
03-02 10:12:04.780: E/AndroidRuntime(22551): at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:276)
03-02 10:12:04.805: E/android.os.Debug(7266): !@Dumpstate > dumpstate -k -t -z -d -o /data/log/dumpstate_app_error
03-02 10:12:16.085: E/JavaBinder(7266): !!! FAILED BINDER TRANSACTION !!!
03-02 10:12:16.140: E/InputDispatcher(7266): channel ~ Channel is unrecoverably broken and will be disposed!
03-02 10:12:16.145: E/InputDispatcher(7266): Received spurious receive callback for unknown input channel. fd=127, events=0x9
03-02 10:12:16.525: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=0, widgetID:1
03-02 10:12:16.525: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : ItemIndex exceed ListItemCount. itemIndex=1
03-02 10:12:16.525: E/ClockAlarmWidget(19060): [AlarmWidgetIdManager] getListItem() : itemIndex=1, widgetID:1
03-02 10:12:18.160: E/WifiHW(7266): ##################### set firmware type 0 #####################
03-02 10:12:19.110: E/JavaBinder(7266): !!! FAILED BINDER TRANSACTION !!!
03-02 10:12:19.120: E/JavaBinder(7266): !!! FAILED BINDER TRANSACTION !!!
03-02 10:12:19.120: E/JavaBinder(7474): !!! FAILED BINDER TRANSACTION !!!
03-02 10:12:22.745: E/WifiHW(7266): ##################### set firmware type 0 #####################
03-02 10:12:29.540: E/Watchdog(7266): !@Sync 16604

Ich hoffe ihr könnt mir helfen.

Danke schonmal.

Gruß
Florian S.

Antworten
  • Forum-Beiträge: 11.223

02.03.2014, 10:16:50 via Website

1java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
203-02 10:12:04.780: E/AndroidRuntime(22551): at de.ftProductions.volcanoJump.ScoreActivity$1.onComplete(ScoreActivity.java:135)
303-02 10:07:04.735: E/AndroidRuntime(21637): at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:276)
Was steht denn in ScoreActivity.java:135?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 1.793

02.03.2014, 10:21:44 via App

Bitte demnächst nur das vom LogCat posten, was rot ist (=Fehler).

Scheinbar kommen die Callbacks vom Facebook-SDK nicht auf dem UI-Thread an? Die Toast-Message (alles was mit Views/Benutzeroberfläche zu tun haet) darf nur vom UI-Thread erzeugt/verändert werden.
Am einfachsten ist es, wenn du ein Activity-Objekt hast und dann Activity#runOnUiThread(...); aufrufst.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
  • Forum-Beiträge: 71

02.03.2014, 13:11:39 via Website

@Pascal P. : ScoreAcitivity ist ja die Klasse die ich ganz oben gepostet habe, und in Zeile 135 steht Toast.makeText(ScoreActivity.this, "ioerror",
Toast.LENGTH_SHORT).show();

@impjor: ich habe mich auch gewundert, dass es so viel ist, aber ich habe bei logcat nur "errors" anzeigen lassen, also alles was ich reinkopiert habe, war rot... und mit dem Activity#onUiThread, wie funktioniert das in meinem Fall? sagt mir leider gar nichts..

Lg
Florian S.

Antworten
  • Forum-Beiträge: 1.793

02.03.2014, 14:29:48 via Website

Du brauchst ein Activity-Object. Dann rufst du dessen runOnUiThread(...)-Methode auf. Als Parameter dann ein Runnable mit dem Toast:
1//Pseude-Code
2Activity meineActivity = ....;
3meineActivity.runOnUiThread(new Runnable() {
4void run() {
5Toast.ma...();
6}});
LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
  • Forum-Beiträge: 71

02.03.2014, 15:17:18 via App

Brauche ich dann für jede Excpetion ein neues Objekt? Sorry kenn mich noch nicht so gut aus mit dem Runnable usw..
Kannst mir des von meinem Code her sagen wo ich was reinmachen muss?

Antworten
  • Forum-Beiträge: 71

02.03.2014, 16:02:47 via App

Okay und muss ich da auch wieder was mit .post machen oder so? bzw. ist das eigentlich jetzt die Lösung damit ich einen besseren Log habe oder damit das Einloggen und Ausloggen richtig funktioniert?

Antworten
  • Forum-Beiträge: 71

02.03.2014, 20:45:08 via Website

Ich wollte eben die Catch-Blöcke nicht leer lassen... Und warum die Infos nicht angezeigt werden, bzw.. warum der Logout funktioniert weißt auch nicht oder?

Das Problem ist, dass ich nirgends für mich verständliche Tutorials für die neue Facebook SDK finde und dann alles nicht so funktioniert wie es funktionieren soll...Aber wie gesagt, erklären kann ich mir das nicht, dass die Daten nicht angezeigt werden obwohl sie wohl erfasst werden und direkt darunter dann eigentlich in der TextView angezeigt werden (zumindest der Name)... und der Logout wird dann wohl einfach nicht so richtig sein, aber weiß da jemand wie man das in meinem App umsetzen kann? Da muss es doch irgendwas geben..

Lg
Florian

— geändert am 02.03.2014, 21:09:30

Antworten
  • Forum-Beiträge: 71

02.03.2014, 21:38:52 via Website

Alles klar, ich habe das jetzt überall drin, hier nochmal die Logcat-Errors:

Beim Login:
wurden diesmal keine Fehler angezeigt (aber leider wird nach wie vor nicht das gewünschte "Welcome Florian S*****" angezeigt...


Beim Logout:
03-02 21:36:29.845: E/AndroidRuntime(32670): FATAL EXCEPTION: main
03-02 21:36:29.845: E/AndroidRuntime(32670): java.lang.NullPointerException
03-02 21:36:29.845: E/AndroidRuntime(32670): at de.ftProductions.volcanoJump.ScoreActivity.onClick(ScoreActivity.java:180)
03-02 21:36:29.845: E/AndroidRuntime(32670): at android.view.View.performClick(View.java:4232)
03-02 21:36:29.845: E/AndroidRuntime(32670): at android.view.View$PerformClick.run(View.java:17298)
03-02 21:36:29.845: E/AndroidRuntime(32670): at android.os.Handler.handleCallback(Handler.java:615)
03-02 21:36:29.845: E/AndroidRuntime(32670): at android.os.Handler.dispatchMessage(Handler.java:92)
03-02 21:36:29.845: E/AndroidRuntime(32670): at android.os.Looper.loop(Looper.java:137)
03-02 21:36:29.845: E/AndroidRuntime(32670): at android.app.ActivityThread.main(ActivityThread.java:4921)
03-02 21:36:29.845: E/AndroidRuntime(32670): at java.lang.reflect.Method.invokeNative(Native Method)
03-02 21:36:29.845: E/AndroidRuntime(32670): at java.lang.reflect.Method.invoke(Method.java:511)
03-02 21:36:29.845: E/AndroidRuntime(32670): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
03-02 21:36:29.845: E/AndroidRuntime(32670): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
03-02 21:36:29.845: E/AndroidRuntime(32670): at dalvik.system.NativeStart.main(Native Method)
03-02 21:36:29.885: E/android.os.Debug(7266): !@Dumpstate > dumpstate -k -t -z -d -o /data/log/dumpstate_app_error

Eine NullPointerException heißt doch, dass irgendetwas wo man drauf zugreifen will null ist oder? Weißt du oder irgendjemand anderes wo? Oder wie hättest du denn den Logout gemacht?

Das waren jetzt übrigens die Logcat-Errors wenn ich den Logout-Vorgang mit
11Session session = Session.getActiveSession();
22 if (!session.isClosed()) {
33 session.closeAndClearTokenInformation();
44 }
ausführe (hier wird in Zeile 2 die NullPointerException angezeigt...

Wenn ich es ändere und den Logout-Vorgang mit
1fb.logout(ScoreActivity.this);
ausführen will, bekomme ich folgende Logcat-Errors:
03-02 22:04:44.965: E/AndroidRuntime(3635): FATAL EXCEPTION: main
03-02 22:04:44.965: E/AndroidRuntime(3635): android.os.NetworkOnMainThreadException
03-02 22:04:44.965: E/AndroidRuntime(3635): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
03-02 22:04:44.965: E/AndroidRuntime(3635): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
03-02 22:04:44.965: E/AndroidRuntime(3635): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
03-02 22:04:44.965: E/AndroidRuntime(3635): at java.net.InetAddress.getAllByName(InetAddress.java:214)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
03-02 22:04:44.965: E/AndroidRuntime(3635): at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
03-02 22:04:44.965: E/AndroidRuntime(3635): at com.facebook.android.Util.openUrl(Util.java:224)
03-02 22:04:44.965: E/AndroidRuntime(3635): at com.facebook.android.Facebook.requestImpl(Facebook.java:804)
03-02 22:04:44.965: E/AndroidRuntime(3635): at com.facebook.android.Facebook.request(Facebook.java:707)
03-02 22:04:44.965: E/AndroidRuntime(3635): at com.facebook.android.Facebook.logoutImpl(Facebook.java:649)
03-02 22:04:44.965: E/AndroidRuntime(3635): at com.facebook.android.Facebook.logout(Facebook.java:642)
03-02 22:04:44.965: E/AndroidRuntime(3635): at de.ftProductions.volcanoJump.ScoreActivity.onClick(ScoreActivity.java:180)
03-02 22:04:44.965: E/AndroidRuntime(3635): at android.view.View.performClick(View.java:4232)
03-02 22:04:44.965: E/AndroidRuntime(3635): at android.view.View$PerformClick.run(View.java:17298)
03-02 22:04:44.965: E/AndroidRuntime(3635): at android.os.Handler.handleCallback(Handler.java:615)
03-02 22:04:44.965: E/AndroidRuntime(3635): at android.os.Handler.dispatchMessage(Handler.java:92)
03-02 22:04:44.965: E/AndroidRuntime(3635): at android.os.Looper.loop(Looper.java:137)
03-02 22:04:44.965: E/AndroidRuntime(3635): at android.app.ActivityThread.main(ActivityThread.java:4921)
03-02 22:04:44.965: E/AndroidRuntime(3635): at java.lang.reflect.Method.invokeNative(Native Method)
03-02 22:04:44.965: E/AndroidRuntime(3635): at java.lang.reflect.Method.invoke(Method.java:511)
03-02 22:04:44.965: E/AndroidRuntime(3635): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
03-02 22:04:44.965: E/AndroidRuntime(3635): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
03-02 22:04:44.965: E/AndroidRuntime(3635): at dalvik.system.NativeStart.main(Native Method)
03-02 22:04:45.030: E/android.os.Debug(7266): !@Dumpstate > dumpstate -k -t -z -d -o /data/log/dumpstate_app_error

Weiß leider nicht, was davon jetzt relevant ist....

Lg
Florian

— geändert am 02.03.2014, 22:06:40

Antworten
  • Forum-Beiträge: 71

03.03.2014, 09:06:10 via Website

Das wird in der schon geposteten Funktion getProfileInformation() gemacht, nämlich mit :
1JSONObject profile = new JSONObject(json);
2 // getting name of the user
3 final String name = profile.getString("name");
4 // getting email of the user
5 final String email = profile.getString("email");
6 // getting email of the user
7 final String id = profile.getString("id");
8
9 img_url=new URL("http://graph.facebook.com/"+id+"/pictrue=type=normal");
10 Bitmap bmp = BitmapFactory.decodeStream(img_url.openConnection().getInputStream());
11 pic.setImageBitmap(bmp);
12 welcome.setText("Welcome " + name);

und das welcome.setText sollte doch eigentlich funktionieren oder nicht? Aber wie ganz am Anfang gesagt ist das komische ja, dass das Programm wohl nie dahin springt, denn selbst als ich an den Anfang der Funktion eine Ausgabe auf einer anderen Text-View durchführen wollte hat es nicht funktioniert, wie schon am Anfang beschrieben. Ganz oben ist auch nochmal mein kompletter Quelltext... Weil eigentlich schon komisch, die Funktion wird regulär aufgerufen, und wenn ich das mit dem Logcat richtig interpretiert habe, werden die Daten ja auch erfasst, was doch eigentlich nur in dieser Funktion passiert oder nicht?

LG
Florian

— geändert am 03.03.2014, 09:06:38

Antworten
  • Forum-Beiträge: 71

03.03.2014, 13:47:59 via Website

Habe es jetzt so abgeändert:
1JSONObject profile = new JSONObject(json);
2 // getting name of the user
3 final String name = profile.getString("name");
4 Log.println(RESULT_OK, "test", name);
5 // getting email of the user
6 final String email = profile.getString("email");
7 // getting email of the user
8 final String id = profile.getString("id");
9
10 img_url=new URL("http://graph.facebook.com/"+id+"/pictrue=type=normal");
11 Bitmap bmp = BitmapFactory.decodeStream(img_url.openConnection().getInputStream());
12 pic.setImageBitmap(bmp);
13 welcome.setText("Welcome " + name);
14 Log.println(RESULT_OK, "test", name);

Bekomme dadurch beim Login folgende Logcat-Ausgabe:
03-03 13:35:32.398: D/Profile(22417): [ 03-03 13:35:32.398 22417:22781 ?/test ]
03-03 13:35:32.398: D/Profile(22417): Florian S******

Allerdings diese Ausgabe nur einmal...
also vermutlich die obere...

*UPDATE*:nachdem ich nun das welcome.setText() nach oben direkt unter die Erfassung vom Namen gestellt habe, bekomme ich die Ausgabe auf der TextView ganz kurz, dann stürzt mein App allerdings ab, hier die Errors:
03-03 13:42:00.003: E/AndroidRuntime(23625): FATAL EXCEPTION: Thread-46963
03-03 13:42:00.003: E/AndroidRuntime(23625): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4925)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:950)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.view.View.requestLayout(View.java:15461)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.view.View.requestLayout(View.java:15461)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.view.View.requestLayout(View.java:15461)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.view.View.requestLayout(View.java:15461)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:292)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.view.View.requestLayout(View.java:15461)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.widget.TextView.checkForRelayout(TextView.java:6644)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.widget.TextView.setText(TextView.java:3732)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.widget.TextView.setText(TextView.java:3590)
03-03 13:42:00.003: E/AndroidRuntime(23625): at android.widget.TextView.setText(TextView.java:3565)
03-03 13:42:00.003: E/AndroidRuntime(23625): at de.ftProductions.volcanoJump.ScoreActivity$1.onComplete(ScoreActivity.java:111)

Antworten
  • Forum-Beiträge: 1.793

03.03.2014, 14:40:37 via Website

Scheinbar wird die Methode nicht auf dem UI-Thread aufgerufen, man darf aber Views nur vom UI-Thread verändern. Du musst den Inhalt des TextViews wie folgt ändern:

1ScoreActivity.this.runOnUiThread(new Runnable() {
2void run() {
3welcome.setText("Hallo ....");
4}
5});

Das Runnable wird dann von der ScoreActivity auf dem UI-Thread ausgeführt.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
  • Forum-Beiträge: 71

03.03.2014, 14:58:15 via Website

Vielen Dank, der Teil vom Problem ist dann gelöst, aber hast du auch noch eine Idee zum Logout? Also wie würdest du das machen?
Also wie gesagt, habe schon unzählige Möglichkeiten ausprobiert, aber keine funktioniert, bekomme z.B NullPointerException oder NetworkonThread-Exception (wie schon gestern Abend gepostet)...

Lg
Florian S.

— geändert am 03.03.2014, 15:03:43

Antworten
  • Forum-Beiträge: 71

03.03.2014, 15:15:46 via Website

Die Zeile hat sich jetzt zwar durch die Änderungen oben auch geändert aber habe es nochmal angeschaut, in der Zeile steht folgende if-Bedingung:
1if (!session.isClosed()) {

der ganze Codeausschnitt:
1if (fb.isSessionValid()) {
2 Session session = Session.getActiveSession();
3 if (!session.isClosed()) {
4 session.closeAndClearTokenInformation();
5 }
6 updateButtonImage();
7 }

LG
Florian

— geändert am 03.03.2014, 15:16:22

Antworten
  • Forum-Beiträge: 71

03.03.2014, 15:21:23 via Website

Ja aber wie krieg ich das hin, dass es nicht null ist? Denn "es besteht ja eine Session", also man ist eingeloggt, bevor man auf logout klicken kann...

Antworten
  • Forum-Beiträge: 71

03.03.2014, 15:40:01 via Website

Hast Recht, nirgends eigentlich, aber ich habe es jetzt abgeändert, klappt aber immer noch nicht.
1public static void logoutfromfb(Context context) {
2 Session session = Session.getActiveSession();
3 if (session != null) {
4 if (!session.isClosed()) {
5 session.closeAndClearTokenInformation();
6 //clear your preferences if saved
7 }
8 } else {
9 session = new Session(context);
10 Session.setActiveSession(session);
11 session.closeAndClearTokenInformation();
12 //clear your preferences if saved
13 }
14 }
Die Funktion wird anstatt dem normalen Logout aufgerufen mit Parameter
1logoutfromfb(ScoreActivity.this.getApplicationContext());
, sollte also eigentlich klappen, oder nicht?
Bekomme aber wieder eine NullPointerException:
03-03 15:34:49.685: E/AndroidRuntime(5019): FATAL EXCEPTION: main
03-03 15:34:49.685: E/AndroidRuntime(5019): java.lang.NullPointerException: Argument 'applicationId' cannot be null
03-03 15:34:49.685: E/AndroidRuntime(5019): at com.facebook.internal.Validate.notNull(Validate.java:29)
03-03 15:34:49.685: E/AndroidRuntime(5019): at com.facebook.Session.<init>(Session.java:227)
03-03 15:34:49.685: E/AndroidRuntime(5019): at com.facebook.Session.<init>(Session.java:212)
03-03 15:34:49.685: E/AndroidRuntime(5019): at de.ftProductions.volcanoJump.ScoreActivity.logoutfromfb(ScoreActivity.java:179)
03-03 15:34:49.685: E/AndroidRuntime(5019): at de.ftProductions.volcanoJump.ScoreActivity.onClick(ScoreActivity.java:189)

in Zeile 179 steht:
1session = new Session(context);
und in 189 steht der Funktionsaufruf, also
1logoutfromfb(ScoreActivity.this.getApplicationContext());

LG

Edit: keine Exception mehr! Hatte vergessen, die ApplicationId bei den Metadaten in der Manifest einzutragen, also keine Exception mehr, das Problem: nichts tut sich...also ich kann zwar den Button klicken ohne Exception oder Ähnliches aber es passiert rein gar nichts... Warum?

— geändert am 03.03.2014, 15:49:28

Antworten
  • Forum-Beiträge: 1.793

03.03.2014, 15:53:40 via Website

Na, ich weiß nicht, ob du einfach eine neue Session so erstallen darfst. Sieh dir mal diesen Link an http://stackoverflow.com/questions/18295998/session-getactivesession-returns-null-when-starting-the-app-although-im-conn

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
  • Forum-Beiträge: 71

03.03.2014, 16:02:40 via Website

Habe jetzt durch den Link versucht folgendes im else-Fall (falls session=null ist) zu machen
1session = Session.openActiveSessionFromCache(context);
2 session.closeAndClearTokenInformation();
Bekomme aber wieder eine NullPointerException....

Lg
Florian

Antworten
  • Forum-Beiträge: 11.223

03.03.2014, 16:25:07 via Website

Gibt's zur Facebook api keine doc oder Beispiel, da müsste das alles erklärt sin.
So hast du nur dauerhaft Fehler.
Am besten du schaust noch mal auf der Entwicklerseite vorbei.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 71

03.03.2014, 16:33:26 via Website

Ich finde dort leider immer nur ein Login und des ist auch anders gelöst, als ich es gelöst habe..
Und auch in allen Foren in denen ich suche, findet man immer nur die gleichen Lösungen und keine funktioniert....deswegen wundert mich, dass egal was ich mach nichts funktioniert...
Und das Problem ist, dass die ganzen Tutorials immer nur die veralteten Funktionen verwenden und die teilweise auch schon gar nicht mehr funktionieren...
Hat da keiner Erfahrung?

Lg
Florian

Antworten
  • Forum-Beiträge: 71

04.03.2014, 10:45:01 via App

Muss ich das sonst auch noch irgendwo aufrufen? Eigentlich wird es ja in dem else-Fall überprüft und ich bekomme ja auch keine Exception sondern es funktioniert einfach ned...

LG

Antworten
  • Forum-Beiträge: 71

04.03.2014, 18:32:43 via Website

Habe es jetzt nochmal mit
1fb.logout(ScoreActivity.this.getApplicationContext());
versucht, bekomme dann allerdings eine NetworkOnMainThreadException, schön und gut, da ich eh schon so einen AsyncRunner habe, damit solche Tasks extra und nicht auf der UI ausgeführt werden, habe ich den benutzt und habe schon folgende Varianten ausprobiert:
1mAsyncRunner.logout(ScoreActivity.this, new RequestListener() {
1mAsyncRunner.logout(ScoreActivity.this.getApplicationContext(), new RequestListener() {
1mAsyncRunner.logout(getApplicationContext, new RequestListener() {
(natürlich mit den jeweiligen Funktionen vom RequestListener), bekomme aber immer eine IllegalArgumentException, hier der Logcat-Auszug:

03-04 18:28:25.885: E/AndroidRuntime(29880): java.lang.IllegalArgumentException: Invalid context argument
03-04 18:28:25.885: E/AndroidRuntime(29880): at android.webkit.CookieSyncManager.createInstance(CookieSyncManager.java:86)
03-04 18:28:25.885: E/AndroidRuntime(29880): at com.facebook.internal.Utility.clearCookiesForDomain(Utility.java:296)
03-04 18:28:25.885: E/AndroidRuntime(29880): at com.facebook.internal.Utility.clearFacebookCookies(Utility.java:320)
03-04 18:28:25.885: E/AndroidRuntime(29880): at com.facebook.Session.closeAndClearTokenInformation(Session.java:614)
03-04 18:28:25.885: E/AndroidRuntime(29880): at com.facebook.android.Facebook.logoutImpl(Facebook.java:665)
03-04 18:28:25.885: E/AndroidRuntime(29880): at com.facebook.android.AsyncFacebookRunner$1.run(AsyncFacebookRunner.java:89)

Und das war bei allen 3 Codebeispielen das gleiche, was mich wundert, ist dass meine Klasse ScoreActivity gar nicht auftaucht, kann mir vielleicht jemand helfen?

Das mit Session usw. habe ich jetzt mal dafür auskommentiert und wollte das erstmal testen...

LG

Antworten