更新 – Android的Facebook的API 3.0错误:无法调用与空调用包的LoginActivity

我正在尝试整合新的Facebook 3.0 API的Android应用程序,但我得到这个exception:

java.lang.RuntimeException:无法恢复活动{dk.imu.konnekt / com.facebook.LoginActivity}:com.facebook.FacebookException:无法使用空调用程序包调用LoginActivity。 如果调用者的launchMode是singleInstance,则会发生这种情况。

我有search这个错误,但没有人似乎有任何与它的影响。 我想这是因为我为每个选项卡使用TabHost和TabsGroupActivities。 但我不知道如何解决这个问题。

我在这里添加了相关的代码:

public class MainTabActivity extends TabActivity { public void onCreate(Bundle savedInstanteState){ super.onCreate(savedInstanteState); setContentView(R.layout.tab_layout); TabHost tabHost = getTabHost(); View shareTab = getLayoutInflater().inflate(R.layout.share_tab, null); tabHost.addTab(tabHost.newTabSpec("Share").setIndicator(shareTab) .setContent(new Intent(MainTabActivity.this, ShareGroupActivity.class))); ... } } 

     public class ShareGroupActivity extends TabsGroupActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); startChildActivity("ShareActivity", new Intent(this, ShareActivity.class)); } } 

     public class ShareActivity extends BaseActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.share); testFacebookConnection(); } public void testFacebookConnection(){ Session session = new Session(this); Session.setActiveSession(session); SessionState state = session.getState(); Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); Session.StatusCallback statusCallback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { Toast.makeText(ShareActivity.this, "Facebook session status changed", Toast.LENGTH_SHORT).show(); } }; if (!session.isOpened() && !session.isClosed() && session.getState() != SessionState.OPENING) { OpenRequest open = new OpenRequest(this).setCallback(statusCallback); List<String> permission = new ArrayList<String>(); permission.add("publish_actions"); open.setPermissions(permission); session.openForPublish(open); } else { Session.openActiveSession(this, true, statusCallback); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); } } 

    任何线索如何解决它?

    更新1堆栈跟踪:

    致命例外:main java.lang.RuntimeException:无法恢复活动{dk.imu.konnekt / com.facebook.LoginActivity}:com.facebook.FacebookException:无法使用空调用程序包调用LoginActivity。 如果调用者的launchMode是singleInstance,则会发生这种情况。 在android.app.android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2234)上的android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2851)上的android.app.ActivityThread.performResumeActivity(ActivityThread.java:2812)。在android.app.ActivityThread $.HandleMessage(ActivityThread.java:1261)在android.os.Handler.dispatchMessage(Handler.java:99)android.os.Looper.loop $ 600(ActivityThread.java:139) (Looper.java:154)at java.lang.reflect.Method.invoke(Method.java) :511)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)at dalvik.system.NativeStart。 main(Native Method)引起:com.facebook.FacebookException:无法使用空调用包调用LoginActivity。 如果调用者的launchMode是singleInstance,则会发生这种情况。 在android.app.android.app.Activity.performResume(Activity.java:4613)android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1236)com.facebook.LoginActivity.onResume(LoginActivity.java:110)。 ActivityThread.performResumeActivity(ActivityThread.java:2796)… 12更多

    更新2:我查看了代码,发现了startChildActivity的实现:

     public void startChildActivity(String Id, Intent intent) { Window window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); if (window != null) { mIdList.add(Id); setContentView(window.getDecorView()); } } 

    它使用标志FLAG_ACTIVITY_CLEAR_TOP。 我试图删除它,但结果没有改变。

    更新3:

    https://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/LoginActivity.java

    Facebook代码使用

     callingPackage = getCallingPackage(); 

     if (callingPackage == null) { throw new FacebookException(NULL_CALLING_PKG_ERROR_MSG); } 

    http://developer.android.com/reference/android/app/Activity.html#getCallingPackage()

    这个方法有一个注释:

    如果调用活动不期望得到结果(即没有使用包含请求代码的startActivityForResult(Intent,int)表单),则调用包将为空。

    在startChildActivity方法中,我使用扩展ActivityGroup的TabsGroupActivity中的getLocalActivityManager()。startActivity来处理选项卡活动。 http://developer.android.com/reference/android/app/LocalActivityManager.html#startActivity(java.lang.String,android.content.Intent)

    这个方法不是笔记所说的。 它不期望结果,并且不使用startActivityForResult方法。 该方法还确保类似于singleinstance launchmode。 我应该如何改变这个方法的实现,所以它可以与Facebook一起工作?

    Related of "更新 – Android的Facebook的API 3.0错误:无法调用与空调用包的LoginActivity"

    我设法find我的问题。 虽然我没有设置

    机器人:launchMode = “singleTask”

    我的LoginActivity了

    机器人:noHistory = “真”

    这导致了这个例外。 因为我不希望用户能够在login后按下第一个活动的button并返回到login屏幕,所以我没有把它写成真实的。 现在我需要find另一个解决scheme。

    经过大量的search,我发现似乎没有一种方法来使用在选项卡中使用的LocalActivityManager的startActivityForResult。

    所以我最终接受了这个需要一个填充整个屏幕的活动。 活动只显示了一秒钟左右良好的networking连接 – 我已经做了一个重新发布错误的选项也..

    开始发布活动:

     Intent intent = new Intent(this, FacebookShareActivity.class); intent.putExtra(Constants.FACEBOOK_MESSAGE, shareMessage.getMessage()); startActivityForResult(intent, 1); 

    Facebook分享活动代码 – 发布给用户墙上:

     public class FacebookShareActivity extends Activity { String message; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.facebook_publishing); message = getIntent().getExtras().getString(Constants.FACEBOOK_MESSAGE); createFacebookConnection(); } public void republishButton_Click(View view){ setVisibilityForRepublishButton(false); createFacebookConnection(); } public void createFacebookConnection() { Session session = new Session(this); Session.setActiveSession(session); Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); Session.StatusCallback statusCallback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { String message = "Facebook session status changed - " + session.getState() + " - Exception: " + exception; //Toast.makeText(FacebookShareActivity.this, message, Toast.LENGTH_SHORT).show(); Log.w("Facebook test", message); if (session.isOpened() || session.getPermissions().contains("publish_actions")) { publishToWall(); } else if (session.isOpened()) { OpenRequest open = new OpenRequest(FacebookShareActivity.this).setCallback(this); List<String> permission = new ArrayList<String>(); permission.add("publish_actions"); open.setPermissions(permission); Log.w("Facebook test", "Open for publish"); session.openForPublish(open); } } }; if (!session.isOpened() && !session.isClosed() && session.getState() != SessionState.OPENING) { session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); } else { Log.w("Facebook test", "Open active session"); Session.openActiveSession(this, true, statusCallback); } } private void setVisibilityForRepublishButton(Boolean visible) { ((Button) findViewById(R.id.republishButton)).setVisibility(visible ? View.VISIBLE : View.GONE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); //Toast.makeText(FacebookShareActivity.this, "onActivityResult", Toast.LENGTH_SHORT).show(); } void publishToWall() { Session session = Session.getActiveSession(); Bundle postParams = new Bundle(); postParams.putString("message", message); final Context context = this; Request.Callback callback = new Request.Callback() { public void onCompleted(Response response) { FacebookRequestError error = response.getError(); if (error != null) { setVisibilityForRepublishButton(true); Toast.makeText(context, error.getErrorMessage(), Toast.LENGTH_SHORT).show(); } else { JSONObject graphResponse = response.getGraphObject().getInnerJSONObject(); String postId = null; try { postId = graphResponse.getString("id"); } catch (JSONException e) { setVisibilityForRepublishButton(true); Log.i("Facebook error", "JSON error " + e.getMessage()); } //Toast.makeText(context, postId, Toast.LENGTH_LONG).show(); finish(); } } }; Request request = new Request(Session.getActiveSession(), "me/feed", postParams, HttpMethod.POST, callback); RequestAsyncTask task = new RequestAsyncTask(request); task.execute(); } } 

    我有同样的问题:尝试login到Facebook,在SDK中提供的对话框,但从本身在一个选项卡组内的活动; 像上面的ShareActivity一样。

    我所做的基本上称为ShareActivity(即ShareGroupActivity)的父活动上的startActivityForResult,而不是在ShareActivity上调用它。

    所以1,在ShareGroupActivity中添加:

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { System.out.println("facebook status called"); super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); } 

    2你需要在src com.facebook下的FacebookSDK项目中修改类Session

    2.1添加一个布尔成员

     public boolean insideTabGroup; 

    2.2修改StartActivityDelegate,即由会话使用来打开login; 添加布尔作为参数

     interface StartActivityDelegate { public void startActivityForResult(Intent intent, int requestCode, boolean insideTabGroup); public Activity getActivityContext(); } 

    2.3在内部类的AuthorizationRequest里面,修改这个委托的实现:

      AuthorizationRequest(final Activity activity) { startActivityDelegate = new StartActivityDelegate() { @Override public void startActivityForResult(Intent intent, int requestCode, boolean insideTabGroup) { if(insideTabGroup) { ActivityGroup parentActivity = (ActivityGroup) activity.getParent(); parentActivity.startActivityForResult(intent,requestCode); } else { activity.startActivityForResult(intent, requestCode); } } @Override public Activity getActivityContext() { return activity; } }; } 

    2.4另外,通过添加布尔参数来修改AuthorizationRequest的其他构造函数。 因为我不使用login到Facebook从别的地方而不是一个活动,没关系。

    2.5修改Session类的tryLoginActivity方法,使用布尔成员作为参数:

     private boolean tryLoginActivity(AuthorizationRequest request) { Intent intent = getLoginActivityIntent(request); if (!resolveIntent(intent)) { return false; } try { request.getStartActivityDelegate().startActivityForResult(intent, request.getRequestCode(),this.insideTabGroup); } catch (ActivityNotFoundException e) { return false; } return true; } 

    3在会话中设置布尔成员:

     Session session = Session.getActiveSession(); session.insideTabGroup = true; 

    这应该够了吧。

    CDT

    我在Parse.com Facebook SDK集成方面也遇到了同样的错误,我错过了对文档中提到的ParseFacebookUtils.finishAuthentication的调用。

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); ParseFacebookUtils.finishAuthentication(requestCode, resultCode, data); }