Note that there are some explanatory texts on larger screens.

plurals
  1. POFacebook Connect works different on emulator/device, but not on Google Play
    text
    copied!<p>I'm getting a weird facebook connect behavior in my app. If I use it in emulator, the calls for facebook.request (to retrieve user data) and facebook.dialog (to post on wall) are made at facebook.authorize > onComplete. But if I use a device for debugging, these calls need to be at onActivityResult() to work.</p> <p>And I've uploaded the device-tested apk into google play, but it doesn't works! The SAME code, if installed from eclipse, it works... if downloaded from Play, doesn't!</p> <p>by "doesn't works", I mean that facebook.request and facebook.dialog aren't called after user is authorized, and the app get stucked in a blank screen.</p> <p>my facebook connect activity:</p> <pre><code>public class FacebookConnectActivity extends Activity { private static final String TAG_JSON = "json"; static Facebook facebook = new Facebook("111111111111111"); AsyncFacebookRunner mAsyncRunner; private SharedPreferences mPrefs; JSONObject json; Context ctx = this; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.resgatar_produto_layout); Log.w("FacebookConnect", "Activity Started"); mPrefs = getPreferences(MODE_PRIVATE); String access_token = mPrefs.getString("access_token", null); long expires = mPrefs.getLong("access_expires", 0); if(access_token != null) { facebook.setAccessToken(access_token); } if(expires != 0) { facebook.setAccessExpires(expires); } if(!facebook.isSessionValid()) { facebook.authorize(this, new String[] {"email", "user_photos", "user_birthday", "user_hometown", "user_relationships","user_location", "user_work_history", "publish_actions"}, new DialogListener() { @Override public void onComplete(Bundle values) { Log.w("FacebookConnect", "User authorized"); /*mAsyncRunner = new AsyncFacebookRunner(facebook); mAsyncRunner.request("me", new SampleRequestListener()); Bundle params = new Bundle(); params.putString("link", "www.qranio.com"); facebook.dialog(ctx, "feed", params, new SampleDialogListener());*/ } @Override public void onFacebookError(FacebookError error) { Log.w("FacebookConnect", "Error authorizing: "+error.toString()); } @Override public void onError(DialogError e) {} @Override public void onCancel() {} }); } } public static void logoutFB(){ if(facebook.isSessionValid()){ facebook.setAccessToken(null); } } public void startDataProcess(){ while (json==null){ } Intent a = new Intent(FacebookConnectActivity.this, FacebookDataProcess.class); a.putExtra(TAG_JSON, json.toString()); startActivity(a); finish(); } public class SampleDialogListener extends BaseDialogListener { public void onComplete(Bundle values) { final String postId = values.getString("post_id"); if (postId != null) { Log.d("Facebook-Example", "Dialog Success! post_id=" + postId); mAsyncRunner.request(postId, new WallPostRequestListener()); } else { Log.d("Facebook-Example", "No wall post made"); startDataProcess(); } } public void onCancel(){ Log.w("FacebookConnect", "Post to Wall Canceled"); startDataProcess(); } } public class WallPostRequestListener extends BaseRequestListener { public void onComplete(final String response, final Object state) { Log.d("WallPostRequestListener", "Got response: " + response); String message = "&lt;empty&gt;"; try { JSONObject json = Util.parseJson(response); message = json.getString("message"); } catch (JSONException e) { Log.w("Facebook-Example", "JSON Error in response"); } catch (FacebookError e) { Log.w("Facebook-Example", "Facebook Error: " + e.getMessage()); //Toast.makeText(ctx, "Erro ao postar no Facebook.", Toast.LENGTH_LONG).show(); } startDataProcess(); } } public class SampleRequestListener extends BaseRequestListener { public void onComplete(final String response, final Object state) { try { // process the response here: executed in background thread Log.d("SampleRequestListener", "Response: " + response.toString()); json = Util.parseJson(response); Log.e("FacebookConnect", "JSON " + json.toString()); startDataProcess(); // then post the processed result back to the UI thread // if we do not do this, an runtime exception will be generated // e.g. "CalledFromWrongThreadException: Only the original // thread that created a view hierarchy can touch its views." } catch (JSONException e) { Log.w("Facebook-Example", "JSON Error in response"); } catch (FacebookError e) { Log.w("Facebook-Example", "Facebook Error: " + e.getMessage()); } } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); facebook.authorizeCallback(requestCode, resultCode, data); try{ mAsyncRunner = new AsyncFacebookRunner(facebook); mAsyncRunner.request("me", new SampleRequestListener()); /*Bundle params = new Bundle(); params.putString("link", "www.qranio.com"); //params.putString("display", "touch"); facebook.dialog(ctx, "feed", params, new SampleDialogListener());*/ Log.e("FacebookConnect", "Authentication authorizeCallback called"); Log.e("FacebookConnect", "Access Token: "+facebook.getAccessToken().toString()); //facebook. //if (facebook.isSessionValid()){ //}else{ //Log.e("FacebookConnect", "Invalid facebook session while trying to fetch user data"); //}*/ }catch(FacebookError fbe){ Log.e("FacebookConnect", "onActivityResult FacebookError " + fbe.toString()); }catch (Exception e){ Log.e("FacebookConnect", "onActivityResult Exception " + e.toString()); } } } </code></pre> <p>[UPDATE] My AndroidManifest.xml</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;manifest android:versionCode="9" android:versionName="1.1.3" package="androidhive.dashboard" xmlns:android="http://schemas.android.com/apk/res/android"&gt; &lt;uses-sdk android:minSdkVersion="8"/&gt; &lt;uses-permission android:name="android.permission.INTERNET"/&gt; &lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&gt; &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&gt; &lt;application android:icon="@drawable/icone" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"&gt; &lt;activity android:label="@string/app_name" android:name="com.androidhive.dashboard.SplashScreen" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"&gt; &lt;intent-filter&gt; &lt;action android:name="android.intent.action.MAIN"/&gt; &lt;category android:name="android.intent.category.LAUNCHER"/&gt; &lt;/intent-filter&gt; &lt;/activity&gt; &lt;activity android:name="com.androidhive.dashboard.AndroidDashboardDesignActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/&gt; &lt;activity android:name="com.androidhive.dashboard.LoginActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/&gt; &lt;activity android:name="com.androidhive.dashboard.RegisterActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/&gt; &lt;activity android:name="com.androidhive.dashboard.LoginWithUsernameActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateAlwaysVisible"/&gt; &lt;activity android:name="com.androidhive.dashboard.FacebookConnectActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/&gt; &lt;activity android:name="com.androidhive.dashboard.FacebookDataProcess" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/&gt; ...other activities... &lt;/application&gt; &lt;/manifest&gt; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload