2015-05-07 49 views
0

编辑:尝试更新Facebook的SDK,仍然无法正常工作。Facebook共享是否有一个优雅的解决方案?

05-07 17:52:02.922 7584-7584/com.example.dan.bmicalculator E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.IllegalStateException: Could not execute method of the activity 
      at android.view.View$1.onClick(View.java:3814) 
      at android.view.View.performClick(View.java:4421) 
      at android.view.View$PerformClick.run(View.java:17903) 
      at android.os.Handler.handleCallback(Handler.java:730) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:213) 
      at android.app.ActivityThread.main(ActivityThread.java:5225) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.reflect.InvocationTargetException 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at android.view.View$1.onClick(View.java:3809) 
            at android.view.View.performClick(View.java:4421) 
            at android.view.View$PerformClick.run(View.java:17903) 
            at android.os.Handler.handleCallback(Handler.java:730) 
            at android.os.Handler.dispatchMessage(Handler.java:92) 
            at android.os.Looper.loop(Looper.java:213) 
            at android.app.ActivityThread.main(ActivityThread.java:5225) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:525) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: com.facebook.FacebookException: Attempted to use a Session that was not open. 
      at com.facebook.widget.WebDialog$BuilderBase.<init>(WebDialog.java:524) 
      at com.facebook.widget.WebDialog$FeedDialogBuilder.<init>(WebDialog.java:708) 
      at com.example.dan.bmicalculator.Results.publishFeedDialog(Results.java:138) 
      at com.example.dan.bmicalculator.Results.onClickShareFacebook(Results.java:98) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:525) 
            at android.view.View$1.onClick(View.java:3809) 
            at android.view.View.performClick(View.java:4421) 
            at android.view.View$PerformClick.run(View.java:17903) 
            at android.os.Handler.handleCallback(Handler.java:730) 
            at android.os.Handler.dispatchMessage(Handler.java:92) 
            at android.os.Looper.loop(Looper.java:213) 
            at android.app.ActivityThread.main(ActivityThread.java:5225) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:525) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
            at dalvik.system.NativeStart.main(Native Method) 

这是基于前一个问题,我问,但没有得到任何回应:

https://stackoverflow.com/questions/30054645/application-crashing-when-using-facebook-share

TL; DR:BMI计算器应用程序的Android在社交媒体功能的份额。 Facebook的分享作品,但崩溃的应用程序。 https://dev.twitter.com/twitter-kit/android/compose

有没有简单和优雅的解决方案facebook的问题:

昨天我用这个优雅而简洁的指导完成了我的Twitter共享功能?或对崩溃问题的任何修复?

下面再次发布代码。

Results.java

package com.example.dan.bmicalculator; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

//START: FACEBOOK - SHARE 
import com.crashlytics.android.Crashlytics; 
import com.facebook.FacebookException; 
import com.facebook.FacebookOperationCanceledException; 
import com.facebook.Session; 
import com.facebook.UiLifecycleHelper; 
import com.facebook.widget.FacebookDialog; 
import com.facebook.widget.WebDialog; 
//END: FACEBOOK - SHARE 

//TWITTER SHARE 
import com.twitter.sdk.android.Twitter; 
import com.twitter.sdk.android.core.TwitterAuthConfig; 
import com.twitter.sdk.android.tweetcomposer.TweetComposer; 

import java.io.File; 

import io.fabric.sdk.android.Fabric; 

public class Results extends Activity { 

    // Note: Your consumer key and secret should be obfuscated in your source code before shipping. 
    private static final String TWITTER_KEY = "I really shouldn't show this"; 
    private static final String TWITTER_SECRET = "I really shouldn't show this"; 

    //START: FACEBOOK - SHARE 
    private UiLifecycleHelper uiHelper; 
    //END: FACEBOOK - SHARE 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 


     TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET); 
     Fabric.with(this, new Twitter(authConfig), new Crashlytics()); 
     final Fabric fabric = new Fabric.Builder(this) 
       .kits(new Crashlytics()) 
       .debuggable(true) 
       .build(); 
     Fabric.with(fabric); 
     Fabric.with(this, new TweetComposer()); 

     //START: FACEBOOK - SHARE 
     uiHelper = new UiLifecycleHelper(this, null); 
     uiHelper.onCreate(savedInstanceState); 
     //END: FACEBOOK - SHARE 

     themeUtils.onActivityCreateSetTheme(this); 
     setContentView(R.layout.activity_results); 

     Bundle BMIData = getIntent().getExtras(); 
     if (BMIData == null) { 
      return; 
     } 

     String BMIMessage = BMIData.getString("BMIMessage"); 
     String BMIText = BMIData.getString("BMIText"); 
     final TextView ResultBMITextView = (TextView) findViewById(R.id.ResultBMITextView); 
     final TextView ResultBMITextTextView = (TextView) findViewById(R.id.ResultBMITextTextView); 
     ResultBMITextView.setText(BMIMessage); 
     ResultBMITextTextView.setText(BMIText); 
    } 

    public void onClickResultsBack(View view) { 
     Intent i1 = new Intent(this, MainActivity.class); 
     i1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(i1); 
     finish(); 
    } 

    public void onClickShareFacebook(View view) { 
     if (FacebookDialog.canPresentShareDialog(getApplicationContext(), 
       FacebookDialog.ShareDialogFeature.SHARE_DIALOG)) { 
      FacebookDialog shareDialog = new FacebookDialog.ShareDialogBuilder(this) 
        .setLink("https://developers.facebook.com/android") 
        .build(); 
      uiHelper.trackPendingDialogCall(shareDialog.present()); 
     } else { 
      FacebookDialog shareDialog = new FacebookDialog.ShareDialogBuilder(this) 
        .setLink("https://developers.facebook.com/android") 
        .build(); 
      uiHelper.trackPendingDialogCall(shareDialog.present()); 
     } 
     publishFeedDialog(); 
     return; 
    } 

    public void onClickShareTwitter(View view) { 
     File myImageFile = new File("C:\\Users\\Dan\\AndroidStudioProjects\\BMICalculator\\app\\src\\main\\res\\drawable"); 
     Uri myImageUri = Uri.fromFile(myImageFile); 
     TweetComposer.Builder builder = new TweetComposer.Builder(this) 
       .text("just setting up my Fabric.") 
       .image(myImageUri); 

     builder.show(); 
     return; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_u, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    //START: FACEBOOK - SHARE 
    private void publishFeedDialog() { 
     Bundle params = new Bundle(); 
     params.putString("name", "Facebook SDK for Android"); 
     params.putString("caption", "Build great social apps and get more installs."); 
     params.putString("description", "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps."); 
     params.putString("link", "https://developers.facebook.com/android"); 
     params.putString("picture", "https://raw.github.com/fbsamples/ios-3.x-howtos/master/Images/iossdk_logo.png"); 

     WebDialog feedDialog = (
       new WebDialog.FeedDialogBuilder(Results.this, 
         Session.getActiveSession(), 
         params)) 
       .setOnCompleteListener(new WebDialog.OnCompleteListener() { 

        @Override 
        public void onComplete(Bundle values, 
              FacebookException error) { 
         if (error == null) { 
          // When the story is posted, echo the success 
          // and the post Id. 
          final String postId = values.getString("post_id"); 
          if (postId != null) { 
           Toast.makeText(Results.this, 
             "Posted story, id: " + postId, 
             Toast.LENGTH_SHORT).show(); 
          } else { 
           // User clicked the Cancel button 
           Toast.makeText(Results.this.getApplicationContext(), 
             "Publish cancelled", 
             Toast.LENGTH_SHORT).show(); 
          } 
         } else if (error instanceof FacebookOperationCanceledException) { 
          // User clicked the "x" button 
          Toast.makeText(Results.this.getApplicationContext(), 
            "Publish cancelled", 
            Toast.LENGTH_SHORT).show(); 
         } else { 
          // Generic, ex: network error 
          Toast.makeText(Results.this.getApplicationContext(), 
            "Error posting story", 
            Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }) 
       .build(); 
     feedDialog.show(); 
    } 

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

     uiHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() { 
      @Override 
      public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) { 
       Log.e("Activity", String.format("Error: %s", error.toString())); 
      } 

      @Override 
      public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) { 
       Log.i("Activity", "Success!"); 
      } 
     }); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     uiHelper.onResume(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     uiHelper.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     uiHelper.onPause(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     uiHelper.onDestroy(); 
    } 
    /* END: FACEBOOK - SHARE */ 
} 

错误日志:

05-06 12:27:26.442 4263-4263/com.example.dan.bmicalculator D/OpenGLRenderer﹕ Enabling debug mode 0 
05-06 12:27:26.532 4263-4263/com.example.dan.bmicalculator D/OpenGLRenderer﹕ GL error from OpenGLRenderer: 0x502 
05-06 12:27:26.532 4263-4263/com.example.dan.bmicalculator E/OpenGLRenderer﹕ GL_INVALID_OPERATION 
05-06 12:27:30.496 4263-4263/com.example.dan.bmicalculator I/com.example.dan.bmicalculator﹕ onStartCommand method called 
05-06 12:27:35.521 4263-4430/com.example.dan.bmicalculator I/com.example.dan.bmicalculator﹕ Service is doing something 
05-06 12:27:40.517 4263-4430/com.example.dan.bmicalculator I/com.example.dan.bmicalculator﹕ Service is doing something 
05-06 12:27:43.400 4263-4263/com.example.dan.bmicalculator D/AndroidRuntime﹕ Shutting down VM 
05-06 12:27:43.400 4263-4263/com.example.dan.bmicalculator W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x420618b0) 
05-06 12:27:43.430 4263-4263/com.example.dan.bmicalculator E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.IllegalStateException: Could not execute method of the activity 
      at android.view.View$1.onClick(View.java:3814) 
      at android.view.View.performClick(View.java:4421) 
      at android.view.View$PerformClick.run(View.java:17903) 
      at android.os.Handler.handleCallback(Handler.java:730) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:213) 
      at android.app.ActivityThread.main(ActivityThread.java:5225) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.reflect.InvocationTargetException 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at android.view.View$1.onClick(View.java:3809) 
      at android.view.View.performClick(View.java:4421) 
      at android.view.View$PerformClick.run(View.java:17903) 
      at android.os.Handler.handleCallback(Handler.java:730) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:213) 
      at android.app.ActivityThread.main(ActivityThread.java:5225) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: com.facebook.FacebookException: Attempted to use a Session that was not open. 
      at com.facebook.widget.WebDialog$BuilderBase.<init>(WebDialog.java:524) 
      at com.facebook.widget.WebDialog$FeedDialogBuilder.<init>(WebDialog.java:708) 
      at com.example.dan.bmicalculator.Results.publishFeedDialog(Results.java:107) 
      at com.example.dan.bmicalculator.Results.onClickShareFacebook(Results.java:73) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at android.view.View$1.onClick(View.java:3809) 
      at android.view.View.performClick(View.java:4421) 
      at android.view.View$PerformClick.run(View.java:17903) 
      at android.os.Handler.handleCallback(Handler.java:730) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:213) 
      at android.app.ActivityThread.main(ActivityThread.java:5225) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
      at dalvik.system.NativeStart.main(Native Method) 

在此先感谢。

+0

@signare这是不幸的,但他张贴这两个问题。 – BIW

+0

你有没有在设备上安装facebook?因为你正在得到一个Facebook例外。 – BIW

+0

升级您的Facebook SDK(4.1版本),它为我解决了一些SDK 3.x问题 – Kai

回答

0

我意识到这个解决方案太杂乱了,我以前使用过之后,我完全重新编写了代码。我还发现这里的另一个导向:

https://developers.facebook.com/docs/sharing/android

这是由共享工作的代码(应用程序是不完整的,但不再有崩溃时,我尝试发布在Facebook上的东西(或Twitter ))

Results.java

package com.example.dan.bmicalculator; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 
import com.crashlytics.android.Crashlytics; 
import com.facebook.CallbackManager; 
import com.facebook.FacebookSdk; 
import com.facebook.share.model.ShareLinkContent; 
import com.facebook.share.widget.ShareDialog; 
import com.twitter.sdk.android.Twitter; 
import com.twitter.sdk.android.core.TwitterAuthConfig; 
import com.twitter.sdk.android.tweetcomposer.TweetComposer; 
import java.io.File; 
import io.fabric.sdk.android.Fabric; 

public class Results extends Activity { 
    // Note: Your consumer key and secret should be obfuscated in your source code before shipping. 
    private static final String TWITTER_KEY = "Secret long number"; 
    private static final String TWITTER_SECRET = "Secret long number"; 
    CallbackManager callbackManager; 
    ShareDialog shareDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     FacebookSdk.sdkInitialize(getApplicationContext()); 
     callbackManager = CallbackManager.Factory.create(); 
     shareDialog = new ShareDialog(this); 



     TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET); 
     Fabric.with(this, new Twitter(authConfig), new Crashlytics()); 
     final Fabric fabric = new Fabric.Builder(this) 
       .kits(new Crashlytics()) 
       .debuggable(true) 
       .build(); 
     Fabric.with(fabric); 
     Fabric.with(this, new TweetComposer()); 

     themeUtils.onActivityCreateSetTheme(this); 
     setContentView(R.layout.activity_results); 

     Bundle BMIData = getIntent().getExtras(); 
     if (BMIData == null) { 
      return; 
     } 

     String BMIMessage = BMIData.getString("BMIMessage"); 
     String BMIText = BMIData.getString("BMIText"); 
     final TextView ResultBMITextView = (TextView) findViewById(R.id.ResultBMITextView); 
     final TextView ResultBMITextTextView = (TextView) findViewById(R.id.ResultBMITextTextView); 
     ResultBMITextView.setText(BMIMessage); 
     ResultBMITextTextView.setText(BMIText); 
    } 

    public void onClickResultsBack(View view) { 
     Intent i1 = new Intent(this, MainActivity.class); 
     i1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(i1); 
     finish(); 
    } 

    public void onClickShareFacebook(View view) { 
     Toast.makeText(this, "Insert Facebook Code Here", Toast.LENGTH_SHORT).show(); 

     if (ShareDialog.canShow(ShareLinkContent.class)) { 
      ShareLinkContent linkContent = new ShareLinkContent.Builder() 
        .setContentTitle("Hello Facebook") 
        .setContentDescription(
          "The 'Hello Facebook' sample showcases simple Facebook integration") 
        .setContentUrl(Uri.parse("http://developers.facebook.com/android")) 
        .build(); 

      shareDialog.show(linkContent); 
     } 

    } 

    public void onClickShareTwitter(View view) { 
     File myImageFile = new File("C:\\Users\\Dan\\AndroidStudioProjects\\BMICalculator\\app\\src\\main\\res\\drawable"); 
     Uri myImageUri = Uri.fromFile(myImageFile); 
     TweetComposer.Builder builder = new TweetComposer.Builder(this) 
       .text("just setting up my Fabric.") 
       .image(myImageUri); 

     builder.show(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_u, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 


    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     callbackManager.onActivityResult(requestCode, resultCode, data); 
    } 
} 
相关问题