Facebook的连接工程模拟器/设备上的不同,而不是在谷歌播放 [英] Facebook Connect works different on emulator/device, but not on Google Play
问题描述
我收到一个奇怪的Facebook Connect在我的应用程序的行为。如果我在模拟器使用,用于facebook.request调用(检索用户数据)和facebook.dialog(张贴在墙上)的facebook.authorize>的onComplete制成。但是,如果我使用的设备进行调试,这些调用必须在onActivityResult()的工作。
和我已上载设备测试的apk到谷歌的发挥,但它不工作!同样的code,如果从安装Eclipse,它的工作原理......如果从游戏下载,不!
由不工作,我的意思是facebook.request和facebook.dialog不叫用户被授权后,和应用程序获得stucked在空白屏幕。
我的Facebook Connect活动:
公共类FacebookConnectActivity延伸活动{
私有静态最后弦乐TAG_JSON =JSON;
静态商标=新的Facebook(111111111111111);
AsyncFacebookRunner mAsyncRunner;
私人共享preferences米preFS;
的JSONObject JSON;
上下文CTX =这一点;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.resgatar_produto_layout);
Log.w(FacebookConnect,活动已启动);
米preFS = GET preferences(MODE_PRIVATE);
字符串access_token = M prefs.getString(access_token,NULL);
长过期= M prefs.getLong(access_expires,0);
若(access_token!= NULL){
facebook.setAccessToken(access_token);
}
如果(到期!= 0){
facebook.setAccessExpires(到期);
}
如果(!facebook.isSessionValid()){
facebook.authorize(这一点,新的String [] {电子邮件,user_photos,user_birthday,user_hometown,user_relationships,user_location,user_work_history,publish_actions},新DialogListener(){
@覆盖
公共无效的onComplete(束值){
Log.w(FacebookConnect,用户授权);
/ * mAsyncRunner =新AsyncFacebookRunner(脸谱);
mAsyncRunner.request(我,新SampleRequestListener());
捆绑PARAMS =新包();
params.putString(链接,www.qranio.com);
facebook.dialog(CTX,饲料,PARAMS,新SampleDialogListener()); * /
}
@覆盖
公共无效onFacebookError(FacebookError错误){
Log.w(FacebookConnect,错误授权:+ error.toString());
}
@覆盖
公共无效onerror的(DialogError E){}
@覆盖
公共无效OnCancel的(){}
});
}
}
公共静态无效logoutFB(){
如果(facebook.isSessionValid()){
facebook.setAccessToken(空);
}
}
公共无效startDataProcess(){
而(JSON == NULL){
}
意图=新的意图(FacebookConnectActivity.this,FacebookDataProcess.class);
a.putExtra(TAG_JSON,json.toString());
startActivity(一);
完();
}
公共类SampleDialogListener扩展BaseDialogListener {
公共无效的onComplete(束值){
最终的字符串postid = values.getString(的post_id);
如果(postId!= NULL){
Log.d(脸谱 - 示例,对话成功的post_id =!+ postId);
mAsyncRunner.request(postId,新WallPostRequestListener());
} 其他 {
Log.d(脸谱 - 示例,无墙后发);
startDataProcess();
}
}
公共无效OnCancel的(){
Log.w(FacebookConnect,张贴到墙上取消);
startDataProcess();
}
}
公共类WallPostRequestListener扩展BaseRequestListener {
公共无效的onComplete(最后弦乐的反应,最终目标状态){
Log.d(WallPostRequestListener,得到了回应:+响应);
字符串消息=<空>中;
尝试 {
JSONObject的JSON = Util.parseJson(响应);
消息= json.getString(信息);
}赶上(JSONException E){
Log.w(脸谱 - 示例,在JSON的错误反应);
}赶上(FacebookError E){
Log.w(脸谱 - 示例,Facebook的错误:+ e.getMessage());
//Toast.makeText(ctx,埃罗鳌postar没有Facebook的,Toast.LENGTH_LONG).show();
}
startDataProcess();
}
}
公共类SampleRequestListener扩展BaseRequestListener {
公共无效的onComplete(最后弦乐的反应,最终目标状态){
尝试 {
//过程中,这里的响应:在后台线程中执行
Log.d(SampleRequestListener,回应:+ response.toString());
JSON = Util.parseJson(响应);
Log.e(FacebookConnect,JSON+ json.toString());
startDataProcess();
//然后发布处理结果回UI线程
//如果我们不这样做,一个运行时异常将会产生
// 例如。 CalledFromWrongThreadException:只有原始
创建一个视图层次可以触摸自己的看法//线程。
}赶上(JSONException E){
Log.w(脸谱 - 示例,在JSON的错误反应);
}赶上(FacebookError E){
Log.w(脸谱 - 示例,Facebook的错误:+ e.getMessage());
}
}
}
@覆盖
公共无效onActivityResult(INT申请code,INT结果code,意图数据){
super.onActivityResult(要求code,因此code,数据);
facebook.authorizeCallback(要求code,因此code,数据);
尝试{
mAsyncRunner =新AsyncFacebookRunner(脸谱);
mAsyncRunner.request(我,新SampleRequestListener());
/ *捆绑PARAMS =新包();
params.putString(链接,www.qranio.com);
//params.putString("display,触摸);
facebook.dialog(CTX,饲料,PARAMS,新SampleDialogListener()); * /
Log.e(FacebookConnect,认证authorizeCallback称为);
Log.e(FacebookConnect,访问令牌。+ facebook.getAccessToken()的toString());
// Facebook上。
//如果(facebook.isSessionValid()){
//}其他{
//Log.e("FacebookConnect,试图获取用户数据)无效Facebook的会议;
//} * /
}赶上(FacebookError FBE){
Log.e(FacebookConnect,onActivityResult FacebookError+ fbe.toString());
}赶上(例外五){
Log.e(FacebookConnect,onActivityResult异常+ e.toString());
}
}
}
[更新] 我的AndroidManifest.xml
< XML版本=1.0编码=UTF-8&GT?;
<舱单安卓版code =9的Android版本:VERSIONNAME =1.1.3
包=androidhive.dashboard的xmlns:机器人=http://schemas.android.com/apk/res/android>
<使用-SDK安卓的minSdkVersion =8/>
<使用-权限的Android:名称=android.permission.INTERNET对/>
<使用-权限的Android:名称=android.permission.ACCESS_NETWORK_STATE/>
<使用-权限的Android:名称=android.permission.WRITE_EXTERNAL_STORAGE/>
<应用机器人:图标=@可绘制/ ICONE
机器人:标签=@字符串/ APP_NAME安卓主题=@安卓风格/ Theme.NoTitleBar.Fullscreen>
<活动机器人:标签=@字符串/ APP_NAME
机器人:名称=com.androidhive.dashboard.SplashScreen
机器人:screenOrientation =画像
机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize>
<意向滤光器>
<作用机器人:名称=android.intent.action.MAIN/>
<类机器人:名称=android.intent.category.LAUNCHER/>
&所述; /意图滤光器>
< /活性GT;
<活动
机器人:名称=com.androidhive.dashboard.AndroidDashboardDesignActivity
机器人:screenOrientation =画像
机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize/>
<活动机器人:名称=com.androidhive.dashboard.LoginActivity
机器人:screenOrientation =画像
机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize/>
<活动
机器人:名称=com.androidhive.dashboard.RegisterActivity
机器人:screenOrientation =画像
机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize/>
<活动
机器人:名称=com.androidhive.dashboard.LoginWithUsernameActivity
机器人:screenOrientation =画像
机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateAlwaysVisible/>
<活动机器人:名称=com.androidhive.dashboard.FacebookConnectActivity
机器人:screenOrientation =画像
机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize/>
<活动机器人:名称=com.androidhive.dashboard.FacebookDataProcess
机器人:screenOrientation =画像
机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize/>
...其他活动...
< /用途>
< /舱单>
Facebook连接是SSO流动,而当它完成onActivityResult叫回来。 你应该处理在那里的响应
简单的例子
@覆盖
保护无效onActivityResult(INT申请code,INT结果code,意图数据){
super.onActivityResult(要求code,因此code,数据);
如果(要求code == AppContext.FACEBOOK_SSO_ACTIVITY_ code){
//成功重定向。
如果(结果code == Activity.RESULT_OK){
//检查的OAuth 2.0 / 2.10错误code。
字符串错误= data.getStringExtra(错误);
如果(错误== NULL){
错误= data.getStringExtra(ERROR_TYPE);
}
其他{// SSO成功
串access_token = data.getStringExtra(access_token);
//从这里开始,你可以做任何你需要
}
}
}
在另一方面,我提出两种实现两个选项(SSO和OAuth的为备用)。 这里是一个示例实现为Facebook的SSO和OAuth的; https://github.com/wareninja/generic-oauth2-login-for-android
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.
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!
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.
my facebook connect activity:
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 = "<empty>";
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());
}
}
}
[UPDATE] My AndroidManifest.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest android:versionCode="9" android:versionName="1.1.3"
package="androidhive.dashboard" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk android:minSdkVersion="8"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application android:icon="@drawable/icone"
android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<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">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name="com.androidhive.dashboard.AndroidDashboardDesignActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/>
<activity android:name="com.androidhive.dashboard.LoginActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/>
<activity
android:name="com.androidhive.dashboard.RegisterActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/>
<activity
android:name="com.androidhive.dashboard.LoginWithUsernameActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateAlwaysVisible"/>
<activity android:name="com.androidhive.dashboard.FacebookConnectActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/>
<activity android:name="com.androidhive.dashboard.FacebookDataProcess"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/>
...other activities...
</application>
</manifest>
Facebook Connect is SSO flow, and when it is done onActivityResult is called back. you should handle the response in there
simple example
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == AppContext.FACEBOOK_SSO_ACTIVITY_CODE) {
// Successfully redirected.
if (resultCode == Activity.RESULT_OK) {
// Check OAuth 2.0/2.10 error code.
String error = data.getStringExtra("error");
if (error == null) {
error = data.getStringExtra("error_type");
}
else {// SSO successful
String access_token = data.getStringExtra("access_token");
// from here on, you can do whatever you need
}
}
}
on the other hand, I suggest two implement both options (sso and oauth as fallback). here is an example implementation for both Facebook SSO and OAuth; https://github.com/wareninja/generic-oauth2-login-for-android
这篇关于Facebook的连接工程模拟器/设备上的不同,而不是在谷歌播放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!