美文网首页
Twitter 登录 分享 集成

Twitter 登录 分享 集成

作者: 乘风破浪的程序员 | 来源:发表于2016-07-15 17:10 被阅读7181次

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

    准备工作:
    1. 给自己的Android Studio安装一个Fabric插件:只要打开Android Studio中的设置下的plugins,一搜Fabric for Android Studio就可以安装了;
    4914.tmp.png
    1. https://apps.twitter.com/中进行create new app,跟着里面的步骤一直走会得到一个app key和一个app secret,注意,如果要进行发推功能的话,那么在这个步骤中,不要忘记选择Read, Write and Access direct messages这一项单选按钮;
    29F.tmp.png
    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

    CBE2.tmp.png

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

    1. 在Androidmanifest.xml中加入
    <meta-data
          android:name="io.fabric.ApiKey"
          android:value="0460e5aa7f8a617cc33f43cdfe849cff23e18de1" />
    

    注意此处的这个值不可改变,直接拷贝即可;

    1. 在自己的主程序开始处,或者是在重写的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());
    
    

    这个是为了加载你的授权信息;

    1. 如果你的项目是要经过混淆的,那么就在混淆代码中加入
    -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>;
    }
    
    1. 将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);
        }
    
    

    稍微解释一下参数:

        .text(String) 是发推的文本
        .image(Uri imageUri) 上面提过是因为只支持本地文件一般Uri.fromFile(file)即可
        .url(URL url)) 这个是网页链接,就是别人点击后跳转的地方,会出现在推文里.
    

    此处需要注意的是应该将你的代码写在success()内部,不然你的登录信息将会丢失,当然了如果读者能找到解决方案,自然再好不过了。
    上方代码中,笔者写了三个功能分别是发推、加载推文、Twitter card。其中一个tweetId是你发推后得到的一个值,你在Twitter官网上随便找一条推文的地址,最后一个数字就是这个ID,比如https://twitter.com/mashable/status/717019039118139393

    注意 分享结果处理

    如果接收不到推特分享的结果,看下TweetComposer.Builder的可能
    builder.createIntent()可以创建一个intent,然后自己调用startActivityForResult,重写onActivityResult来接受结果即可.
    需要注意的是这样context的类型必须是activity了.

    有时登录按钮无法点击注意检查

    初始化时一定要放在布局前面,否则登录按钮无法点击

    本人测试过程中出现了上面错误外,还出现了下面错误: 授权失败

    07-15 20:27:01.052 27884-27884/com.example.hante.newpro I/Timeline: Timeline: Activity_launch_request time:257230679
    07-15 20:27:06.354 27884-27884/com.example.hante.newpro E/Twitter: Authorization completed with an error
                                                                       com.twitter.sdk.android.core.TwitterAuthException: Authorize failed.
                                                                           at com.twitter.sdk.android.core.identity.AuthHandler.handleOnActivityResult(AuthHandler.java:97)
                                                                           at com.twitter.sdk.android.core.identity.TwitterAuthClient.onActivityResult(TwitterAuthClient.java:161)
                                                                           at com.twitter.sdk.android.core.identity.TwitterLoginButton.onActivityResult(TwitterLoginButton.java:131)
                                                                           at com.example.hante.newpro.MainActivity2.onActivityResult(MainActivity2.java:391)
                                                                           at android.app.Activity.dispatchActivityResult(Activity.java:5437)
                                                                           at android.app.ActivityThread.deliverResults(ActivityThread.java:3352)
                                                                           at android.app.ActivityThread.handleSendResult(ActivityThread.java:3399)
                                                                           at android.app.ActivityThread.access$1300(ActivityThread.java:138)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1249)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:136)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5016)
                                                                           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:792)
    
    

    检查 是否将应用添加到Twitter 中及获取的 TWITTER_KEY TWITTER_SECRET.

    当手机安装了推特客户端,那么以上代码都没有问题,但是如果没有安装,那么就不能授权!
    解决办法是去推特开发者后台,把app的setting下的callback url设置一下,不论什么,可以访问即可!

    相关文章

      网友评论

          本文标题:Twitter 登录 分享 集成

          本文链接:https://www.haomeiwen.com/subject/ewmyjttx.html