Android Facebook和Twitter分享

1. 背景

在年初的时候,公司的项目有个新的需求,在英文版的应用中加入Facebook和Twitter分享功能。

2. 完成情况

由于这个项目比较急,所以开发这个功能从预研到接入总共耗时一周。后来,在发了第一个英文正式版之后,在时间不是那么紧迫的情况下,将原来使用第三方库的Twitter分享,进行了重写,替换为Twitter官方SDK接入功能,耗时一周,所以从一开始的预研到最终定稿,总共花费时间两周。

3. 预研与接入

3.1 Facebook

在预研Facebook的时候,在我印象中,好像没有什么困难的地方,一切进行得都还挺顺利的样子。接着看吧,随着笔者的回忆,困难与问题也许会慢慢浮出水面的。

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

这个地址是Facebook官方分享的文档地址,有兴趣的可以自行阅读。下面主要介绍笔者根据这个文档进行预研与接入的步骤:

准备工作:

1) 从上方地址中可以下载到Facebook official SDK;

2) 从自己账户下拉菜单中选择add a new app,然后跟着里面的操作一步一步进行即可,最后你会得到一个Facebook app id;

3) 从 https://developers.facebook.com/docs/android/getting-started#create_hash中可以看到

然后到可以执行这二条命令行之一的地方执行,可以得到一个公钥,并且将这个填写到(注意,在大部份windows下是不能执行以上命令的,所以笔者建议可以安装一个类似可以执行Linux命令的模拟器)

准备工作就这么多了,下面开始进行代码接入步骤了。

1) 集成Facebook SDK到项目中去:将准备工作中下载的Facebook SDK包放到项目中去,然后在gralde文件中加入代码

compile(name: 'facebook-android-sdk-4.10.0', ext: 'aar')

2) 在AndroidManifest.xml中加入

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
        <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"/>
        <provider
            android:authorities="com.facebook.app.FacebookContentProvider{facebook_app_id}"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="true"/>

其中的APP_ID就是第二步中得到的值。

3) 在你主程序刚开始的地方,或者自己重写的Application类的onCreate()中加入:

FacebookSdk.sdkInitialize(getApplicationContext());

4) 组建要分享的内容并且调用分享代码即可,

ShareLinkContent.Builder shareLinkContentBuilder = new ShareLinkContent.Builder();
		shareLinkContentBuilder.setContentDescription()
				.setContentTitle()
				.setContentUrl();
		ShareLinkContent shareLinkContent = shareLinkContentBuilder.build();
		if (ShareDialog.canShow(ShareLinkContent.class)) {
			ShareDialog.show((Activity)mContext, shareLinkContent);
		}

那么Facebook分享的内容差不多就是这么一些了。如果读者能跟着笔者走到这一步,相信目标近在咫尺了。

3.2 Twitter

接下来,笔者要说一说关于Twitter分享的过程与心得。这里笔者只介绍使用Twitter官方文档来接入Twitter功能,至于如何使用第三方库来完成,下次有空的时候再另写一篇Blog吧。相比Facebook分享的接入,笔者以为Twitter要复杂的多。其中涉及的操作也比Facebook繁琐很多,但是whatever,笔者此时能在这里记录这篇Blog,总算是能说明这件事情过去了,不管遇到了哪些问题,也总算是解决了。

弯路

凡事并不总是按照我们所预想着的方向顺利发展的。在笔者进行Twitter分享的过程中,尤能体现这一点。首先说一说笔者一开始通过查网页的方式进行查资料。笔者第一次进入Twitter官方介绍是在以下地址https://dev.twitter.com/oauth,这里主要介绍的是如何进行用户进入Twitter平台的授权方式。当然了,Twitter平台在用户登录时有一个授权的过程,只是有些时候,我们平常用户不能看到而已。于是笔者就顺着这条路往下走,然后就走进了开源的授权代码中。因为这是一条弯路,所以笔者只介绍到这里,不要再前进了,但是读者要是能一直走到底的话,那就太厉害了。笔者是不想继续了。

正途

弯路总归还是少走一点的好,毕竟人生路并不长。

https://docs.fabric.io/此站点是Twitter官方文档,有兴趣的可以自行查看。笔者主要介绍自己根据此文档,并且成功进行Twitter分享的步骤。

准备工作:

1) 给自己的Android Studio安装一个Fabric插件:只要打开Android Studio中的设置下的plugins,一搜Fabric for Android Studio就可以安装了;

2) 到https://apps.twitter.com/中进行create new app,跟着里面的步骤一直走会得到一个app key和一个app secret,注意,如果要进行发推功能的话,那么在这个步骤中,不要忘记选择Read, Write and Access direct messages这一项单选按钮;

准备工作就这点,少吧。

buildscript {
  repositories {
    jcenter()
    maven { url 'https://maven.fabric.io/public' }
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:1.5.0'
    // The Fabric Gradle plugin uses an open ended version to react
    // quickly to Android tooling updates
    classpath 'io.fabric.tools:gradle:1.+'
  }
}

apply plugin: 'com.android.application'
//Put Fabric plugin after Android plugin
apply plugin: 'io.fabric'

repositories {
    jcenter()
    maven { url 'https://maven.fabric.io/public' }
}

将这一段代码拷到主程序的build.gradld的第一行中,此处是声明一个maven库,从中我们可以进行后续的下载包的工作。

compile('com.twitter.sdk.android:twitter:1.13.0@aar') {
        transitive = true;
    }
    compile('com.twitter.sdk.android:tweet-composer:1.0.3@aar') {
        transitive = true;
    }
    compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
        transitive = true;
    }
    compile('com.twitter.sdk.android:tweet-ui:1.10.0@aar') {
        transitive = true;
    }

将这一段代码拷到该文件的dependencies中进行程序包的下载。可以看到里面有跟Twitter毫无关系的程序包,比如crashlytics。但是笔者将其列在此处,说明少了它还是不行的,最起码程序无法正常通过编译。

在主程序目录下创建一个文件名为fabric.properties里面就写入

apiSecret=准备工作中的secret
apiKey=准备工作中的key

到这里,这个文件就不用去动了,等下要用到插件的时候,这个文件会自动进行更新并且替换掉原来的secret值,这些都是正常的。

接下来进行代码的接入。

1) 在Androidmanifest.xml中加入

<meta-data
            android:name="io.fabric.ApiKey"
            android:value="0460e5aa7f8a617cc33f43cdfe849cff23e18de1" />
注意此处的这个值不可改变,直接拷贝即可;
2) 在自己的主程序开始处,或者是在重写的Application类的onCreate()中加入

TwitterAuthConfig authConfig = new TwitterAuthConfig(Constants.TWITTER_API_KEY, Constants.TWITTER_API_SECRET);
Fabric.with(this, new Twitter(authConfig));
Fabric.with(this, new TwitterCore(authConfig), new TweetUi());
Fabric.with(this, new TwitterCore(authConfig), new TweetComposer(), new Crashlytics());
这个是为了加载你的授权信息;

3) 如果你的项目是要经过混淆的,那么就在混淆代码中加入

-dontwarn com.squareup.okhttp.**
-dontwarn com.google.appengine.api.urlfetch.**
-dontwarn rx.**
-dontwarn retrofit.**
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
    @retrofit.http.* <methods>;
}

4) 将Twitter官方的登录按钮写入到你自己的布局文件中去

<com.twitter.sdk.android.core.identity.TwitterLoginButton
     android:id="@+id/login_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />

并且在程序中能过findViewById()找到这个按钮,通过如下方法
loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
        btnShowTweet = (Button) findViewById(R.id.btn_show_tweet);
        llTweets = (LinearLayout) findViewById(R.id.ll_tweets);
        btnShowTweet.setOnClickListener(this);
        loginButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {
                // Do something with result, which provides a TwitterSession for making API calls
                TwitterAuthToken authToken = result.data.getAuthToken();
                String token = authToken.token;
                String secret = authToken.secret;
                Toast.makeText(MainActivity.this, token + " " + secret, Toast.LENGTH_LONG).show();
                //compose a tweet
                TweetComposer.Builder builder = new TweetComposer.Builder(MainActivity.this)
                        .text("just setting up my Fabric.")
                        .image(getImgUri());
                builder.show();

                //load tweets
//                TweetUtils.loadTweets(tweetIds, new Callback<List<Tweet>>() {
//                    @Override
//                    public void success(Result<List<Tweet>> result) {
//                        for (Tweet tweet : result.data) {
//                            llTweets.addView(new TweetView(MainActivity.this, tweet));
//                        }
//                    }
//
//                    @Override
//                    public void failure(TwitterException e) {
//
//                    }
//                });

                //app card
//                final TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession();
//                final Card card = new Card.AppCardBuilder(MainActivity.this).imageUri(getImgUri()).googlePlayId("com.medzone.twitterpic").build();
//                final Intent intent = new ComposerActivity.Builder(MainActivity.this).session(session).card(card).createIntent();
//                startActivity(intent);
            }

            @Override
            public void failure(TwitterException exception) {
                // Do something on failure
                Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_LONG).show();
                Log.d("hsc", exception.getMessage());
            }
        });
    }

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

        // Pass the activity result to the login button.
        loginButton.onActivityResult(requestCode, resultCode, data);
    }
此处需要注意的是应该将你的代码写在success()内部,不然你的登录信息将会丢失,当然了如果读者能找到解决方案,自然再好不过了。

上方代码中,笔者写了三个功能分别是发推、加载推文、Twitter card。其中一个tweetId是你发推后得到的一个值,你在Twitter官网上随便找一条推文的地址,最后一个数字就是这个ID,比如https://twitter.com/mashable/status/717019039118139393

5) 好,到这里为止,离目标还有最后一步了,还记得最初下载安装的Fabric插件吧。在Android Studio工具栏中可以找到这个插件按钮,点击进入即可。进去之后你会发现,里面可能没有Twitter包可以用来安装,这个时候就要用到最初下载的Crashlytic包了,然后插件会弹出来一些代码让你修改,事实上之前的步骤中已经完成了,读者不妨再查漏补缺一下,现在只能走一下这个插件的流程而已。

6) 运行。

总算到尽头了。

4. 总结

在做这两个分享的时候,在Twitter中遇到的困难比在Facebook中多很多,从上面的步骤中就可以看出这一点来,但是也是慢慢解决、慢慢克服的一个过程。

在Facebook中,似乎没有什么难点,可能会在执行命令行的那一步受到阻碍。还有一点是当你在开发的时候,你用自己的Facebook账号是可以进行分享的,但是你会发现如果用了不是你自己的开发账号,其实是不能分享出去的,原因在哪里呢?在你的Facebook开发账号下的应用程序信息中,你可能会看到类似的信息,如果你的应用已经在Google Play上上架了,那么就会出现图片中的信息,否则就会是“在开发阶段”。

在Twitter中,操作很繁琐,步骤也很复杂,笔者遇到的杂七杂八的问题也不少,最常见的一个问题就是登录时Twitter授权不成功,这个太无语了,主要原因是不要二次发送相同的内容,一定要保证每一次的推文的唯一性。

5 特别注意

网络要好!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Android Studio提供了多种分享功能,可以让用户将应用程序中的内容分享到其他应用程序或社交媒体平台上。其中包括: 1. Intent分享:使用Intent来启动其他应用程序,例如分享FacebookTwitter等社交媒体平台。 2. 分享对话框:使用Android系统提供的分享对话框,让用户选择要分享的应用程序。 3. 自定义分享:开发者可以自定义分享功能,例如创建自己的分享对话框或分享按钮。 总之,Android Studio提供了丰富的分享功能,可以帮助开发者轻松实现应用程序的分享功能。 ### 回答2: Android Studio 是一个开发 Android 应用程序的集成开发环境,它提供了各种各样的功能来辅助开发人员完成他们的工作。其中之一就是分享功能,它允许用户通过他们的应用程序与其他人共享内容或信息。 在 Android Studio 中实现分享功能需要以下步骤: 1. 在 AndroidManifest.xml 文件中定义一个 Intent-filter,并将其设置为 ACTION_SEND。此操作将使你的应用程序能够与其他应用程序一起处理“共享”操作。 2. 创建您要分享的内容。内容可以是文本、图像、视频或其他任何类型的数据。 3. 使用 Intent 类创建一个包含要分享内容的 Intent,并设置 Intent 的类型、标题和文本。 4. 启动一个 IntentChooser,允许用户选择他们要分享的应用程序。 下面是一个示例代码: ``` Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_TEXT, "这是一段分享的文本"); startActivity(Intent.createChooser(shareIntent, "分享到")); ``` 在这个例子中,我们创建了一个包含文本“这是一段分享的文本”的 Intent,并将其设置为 text/plain 类型。当启动分享操作时,用户将会看到一个名为“分享到”的对话框,其中列出了所有可用于处理 Intent 的应用程序。 可以通过将 Intent 的类型更改为图像、视频或其他类型的数据来共享不同类型的内容。你可以根据你的应用程序的要求自定义 Intent,包括设置内容、标题、类别、标志等。 总结来说,Android Studio 提供了非常方便的分享功能,这对开发人员来说是一个很好的特性。 通过使用 Android Studio,开发人员可以轻松地实现这个功能来提高应用程序的用户体验。 ### 回答3: Android Studio是一款用于开发Android应用程序的集成开发环境。在Android Studio中,集成了丰富的工具和插件,方便开发者进行开发、测试和调试。其中包括了分享功能,允许开发者将应用程序分享到其他应用程序中,从而方便用户进行使用和分享Android Studio提供了两种不同的分享方式:系统分享和自定义分享。其中,系统分享是指将应用程序所支持的数据类型(如文本、图片等)直接分享到系统中已经安装的其他应用程序中。自定义分享则是开发人员根据自己的需求和应用场景,自定义分享的功能和实现方法。 在使用系统分享功能时,开发者需要借助Android系统提供的Intent机制来实现。具体来说,开发者需要构建一个包含要分享的数据的Intent对象,并通过startActivity()方法来启动该Intent。系统会根据Intent中指定的数据类型匹配已经安装的其他应用程序,并将数据传递给匹配的应用程序。 自定义分享的实现方法则需要结合Android系统提供的ContentProvider机制。开发者需要先定义一个ContentProvider,然后将要分享的数据存储到ContentProvider中。在分享时,开发者可以构建一个Intent对象,并指定Intent的Action为ACTION_SEND,Type为ContentProvider中存储的数据类型,然后将ContentProvider的URI作为Intent的Extra传递给其他应用程序。这样,其他应用程序就可以通过ContentResolver来获取ContentProvider中存储的数据,并对其进行使用或分享。 总之,Android Studio的分享功能为开发者提供了多种实现方式,可以根据应用场景和需求灵活选择。同时,开发者也可以结合系统提供的机制和工具来实现自定义的分享功能,从而提升应用程序的用户体验和分享效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值