草庐IT

android - Facebook 与 android studio 共享

coder 2023-12-21 原文

亲爱的 stackoverflow 用户,

恐怕我急需帮助。我的应用程序一直遇到一个问题。 我正在制作一个具有三个按钮的应用程序:一个用于查看链接,一个用于 Intent ,一个用于在 Facebook 上共享内容(原因是您不能再发送有 Intent 的内容,或者有人告诉我) 然而,根据 Facebook 开发者网站,我应该得到一个分享按钮。使用我的代码,一切都崩溃了,我唯一能看到的就是共享对话框。我的问题是,我犯的主要错误是什么?

我的主要 Activity 代码:

package things;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.view.View.OnClickListener;

import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.share.ShareApi;
import com.facebook.share.Sharer;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.widget.ShareButton;
import com.facebook.share.widget.ShareDialog;

import java.util.Random;


public class MainActivity extends ActionBarActivity {

private Button btnScore;
private Button btnShare;

private static String APP_ID = "things";

CallbackManager callbackManager;
ShareDialog shareDialog;

//ms = mobile Scores
WebView msWebView;
WebView mfWebView;


ShareLinkContent content = new ShareLinkContent.Builder()
        .setContentTitle("Test")
        .setContentUrl(Uri.parse("http://developers.facebook.com/android"))
        .setContentDescription("Play Something with your facebook friends and many more people!")
        .build();


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());

    //Facebook for  sharing
    callbackManager = CallbackManager.Factory.create();
    shareDialog = new ShareDialog(this);
    final ShareButton shareButton = (ShareButton) findViewById(R.id.fb_share_button);


    int score = 64;

    //Searches the phone for apps that can share simple data
    final Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.setType("text/plain");
    sendIntent.putExtra(Intent.EXTRA_TEXT, "My score of the last game  was: " + score + " \n Can you beat my score?");

    //This is for the share dialog to show





    //an iff statement if it shows
    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);
    }
    shareButton.setShareContent(content);

    //The buttons
    btnScore=(Button)findViewById(R.id.btnScores);
    btnShare =(Button)findViewById(R.id.btnShare);



    //the score Webview link
    msWebView = new WebView(this);
    msWebView.loadUrl("Thing");
    msWebView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String     url){
            view.loadUrl(url);
            return true;
        }
    });

   ShareDialog.show(this, content);
   btnScore.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View vw) {
            setContentView(msWebView);
        }
    });

    //the share button
    btnShare.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View vw)     {startActivity(Intent.createChooser(sendIntent, "share..."));

        }
    });
    shareButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            shareButton.setShareContent(content);
        }
    }     );
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu.
    // Adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);

    // Access the Share Item defined in menu XML


    return true;
}

//special method to handle the callbackmanager
@Override
protected void onActivityResult(final int requestCode, final int  resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
    ShareDialog.show(this, content);
}

@Override
  public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.menu_item_share) {
       return true;
    }

    return super.onOptionsItemSelected(item);
}


}

我的 Activity_Main.XML:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"     tools:context=".MainActivity"
android:background="#ffd2e489">

<TextView android:text="Results"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/text"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="View"
    android:id="@+id/btnScores"
    android:background="#ffff7878"
    android:layout_marginTop="40dp"
    android:layout_below="@+id/text"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_toLeftOf="@+id/text"
    android:layout_toStartOf="@+id/text" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Share"
    android:id="@+id/btnShare"
    android:background="#ff20f6ff"
    android:layout_alignTop="@+id/btnScores"
    android:layout_toRightOf="@+id/text"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<com.facebook.share.widget.ShareButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fb_share_button"
android:text="SHARE"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="175dp" />


</RelativeLayout>

以防万一我的 Android: list :

<uses-permission android:name="android.permission.INTERNET" />
<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <meta-data android:name="com.facebook.sdk.ApplicationId"    android:value="@string/app_id"/>
    <activity

        android:name=".MainActivity"
        android:label="@string/app_name" >

        <intent-filter>
            <provider   android:authorities="com.facebook.app.FacebookContentProviderthings"
                android:name="com.facebook.FacebookContentProvider"
                android:exported="true"/>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="text/plain"/>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.facebook.FacebookActivity"
        android:configChanges=
            "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:label="@string/app_name" />
    android:debuggable="true"
</application>

</manifest>

抱歉发了这么长的帖子,我知道答案就在那里,但找不到那个令人毛骨悚然的错误,这已经困扰我一周了。

感谢阅读!

弗雷德里克

编辑:我正在使用 facebookSDK 4.0。

编辑 2.0:错误:

 Caused by: java.lang.NullPointerException
        at things.MainActivity.onCreate(MainActivity.java:93)
        at android.app.Activity.performCreate(Activity.java:5231)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2201)

编辑 3.0 的 Logcat:

 Process: nl.test.test, PID: 12287
java.lang.ExceptionInInitializerError
        at java.lang.reflect.Constructor.constructNative(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at android.view.LayoutInflater.createView(LayoutInflater.java:594)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
        at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:240)
        at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:102)
        at nl.test.test.MainActivity.onCreate(MainActivity.java:60)
        at android.app.Activity.performCreate(Activity.java:5231)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2201)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2286)
        at android.app.ActivityThread.access$800(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:212)
        at android.app.ActivityThread.main(ActivityThread.java:5135)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: null
        at com.facebook.internal.Validate.sdkInitialized(Validate.java:99)
        at com.facebook.FacebookSdk.getCallbackRequestCodeOffset(FacebookSdk.java:735)
        at com.facebook.internal.CallbackManagerImpl$RequestCodeOffset.toRequestCode(CallbackManagerImpl.java:109)
        at com.facebook.share.widget.ShareButton.<clinit>   (ShareButton.java:36)
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)

android.view.LayoutInflater.rInflate(LayoutInflater.java:755)

android.view.LayoutInflater.inflate(LayoutInflater.java:492)



android.view.LayoutInflater.inflate(LayoutInflater.java:397)

   android.view.LayoutInflater.inflate(LayoutInflater.java:353)
android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:240)
                android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:102)
            test.MainActivity.onCreate(MainActivity.java:60)
            at android.app.Activity.performCreate(Activity.java:5231)
             android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2201)
            android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2286)
            android.app.ActivityThread.access$800(ActivityThread.java:144)                   android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246)
            android.os.Handler.dispatchMessage(Handler.java:102)
            android.os.Looper.loop(Looper.java:212)
        android.app.ActivityThread.main(ActivityThread.java:5135)
        java.lang.reflect.Method.invokeNative(Native Method)
        java.lang.reflect.Method.invoke(Method.java:515)
        com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
        com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
dalvik.system.NativeStart.main(Native Method)

最佳答案

好的,经过一些工作,我找到了答案。答案很简单: 而不是这个:

super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());

但是你需要做的是:

FacebookSdk.sdkInitialize(getApplicationContext()); 
super.onCreate(savedInstanceState);

之所以这样做,是因为您想在创建应用程序实例之前初始化 Facebook SDK,否则应用程序永远无法使用 Facebook SDK。

我希望如果有人遇到和我一样的问题,可以使用这个!

关于android - Facebook 与 android studio 共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29846006/

有关android - Facebook 与 android studio 共享的更多相关文章

  1. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  2. ruby-on-rails - 如何在 Rails Controller Action 上触发 Facebook 像素 - 2

    我有一个ruby​​onrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  5. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  6. ruby - 在模块/类之间共享全局记录器 - 2

    在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

  7. ruby - 如何使用 cucumber 在场景之间共享状态 - 2

    我有一个功能“从外部网站导入文章”。在我的第一个场景中,我测试从外部网站导入链接列表。Feature:ImportingarticlesfromexternalwebsiteScenario:Searchingarticlesonexample.comandreturnthelinksGiventhereisanImporterAnditsURLis"http://example.com"Whenwesearchfor"demo"ThentheImportershouldreturn25linksAndoneofthelinksshouldbe"http://example.com/d

  8. ruby - Sinatra 路由中定义的全局变量是否在请求之间共享? - 2

    假设我有:get'/'do$random=Random.rand()response.body=$randomend如果我每秒有数千个请求到达/,$random是否会被共享并“泄漏”到上下文之外,或者它会像getblock的“本地”变量一样?我想如果它是在get'/'do的上下文之外定义的,它确实会被共享,但我想知道在ruby​​中是否有我不知道的$机制。 最佳答案 ThispartoftheSinatraREADMEaboutscopeisalwayshelpfultoread但是,如果您只需要为请求保留变量,那么我认为我建议使用

  9. ruby - 跨线程共享枚举器 - 2

    我想从不同线程调用一个公共(public)枚举器。当我执行以下操作时,enum=(0..1000).to_enumt1=Thread.newdopenum.nextsleep(1)endt2=Thread.newdopenum.nextsleep(1)endt1.joint2.join它引发了一个错误:Fibercalledacrossthreads.当enum在从t1调用一次后从t2调用时。为什么Ruby设计为不允许跨线程调用枚举器(或纤程),以及是否有其他方法可以提供类似的功能?我猜测枚举器/纤程上的操作的原子性在这里是相关的,但我不完全确定。如果这是问题所在,那么在使用时独占锁定

  10. ruby - 两个 gem 共享相同的要求? - 2

    当我打电话时:require'retryable'这两个gem冲突:https://github.com/robertsosinski/retryablehttps://github.com/carlo/retryable因为他们都有一个“可重试”文件,所以他们要求用户要求。我对使用第一个gem很感兴趣,但这并不总是会发生。这段代码作为我自己的gem的一部分执行,它必须对所有用户都是可靠的。有没有办法从gem中专门要求(因为gem名称当然不同)?如何解决这个命名冲突?编辑:澄清一下,这是官方仓库,gem名称实际上是不同的(“retryable-rb”和“carlo-retryable”

随机推荐