最近公司的软件需要改国际版,需要Facebook和Twitter的登录和分享。

本人先用Umeng的第三方社会化分享实现了该功能,但是后来一想问题来了,经过查证。Umeng只在中国和美国有服务器,那也就是说别的国家的人如果用该产品登录和分享可不就成了摆设,这下苦逼了,然后就又重新推倒重来,索性用官方的facebook和twitter来实现登录和分享。具体步骤:

第一,因为中国政府各种坑比墙国外的服务器,导致facebook和twitter访问不了,那第一步就需要FQ,顺便FQ看看苍老师什么的,,,,我在网上找到了一个比较好的FQ软件:蓝灯(Lantern)

进入该网站,本人下载了mac版本。顺便做下载了对应的android apk,用法很简单。安装上之后开启就行了,这样你就能访问苍老师,天海翼了

第二步:既然咱们成功FQ了,那就开始咱们的步伐:

Facebook登录和分享

咱们先进入facebook的官网

然后注册账号。我使用邮箱注册的,注册完成之后就可以创建项目了

因为我已经创建过,所以这块就各位自己操作就行,

然后咱们要做的就是看文档。

进入此网站就可以看到facebook其实写的已经很清楚了:https://developers.facebook.com/docs/facebook-login/android

咱们在Android studio(本人用Android studio来写的程序,如果不太熟Android studio的可以自行在网上查查具体用法)中具体要怎么操作呢,如下

因为facebook官网下载的sdk后缀名是(.aar)的,不是咱们正常的jar包,所以我索性就在Android studio中找jar包,就是如上图所示。

然后只需要按照facebook文档中的步骤往下就可以了

-------------------------------------------------------------------facebook文档开始-----------------------------------------------------------

A. 下载 Facebook 应用

点击下方的按钮,下载 Facebook 应用。

下载 Android 版 Facebook

B. 创建开发者帐户

如果没有 Facebook 开发者帐户,请点击下面的按钮创建。您可以通过 Facebook 开发者帐户使用开发者工具和创建 Facebook 应用。

创建开发者帐户

C. 下载 Android SDK

下载最新的 Android 版 Facebook SDK。

下载 Android SDK

D. 获得 Facebook 应用编号、添加 SDK、以及向资料页添加密钥散列

点击下方的按钮,按照快速入门操作,也可以按照新手入门中的步骤操作。

Android 快速入门

E. 为应用启用单点登录

为应用启用单点登录的方法是:在 Facebook 开发者网站的我的应用中选择您的应用,然后选择应用的设置,并将单点登录设置为

F. 将FacebookActivity添加到AndroidManifest.xml中。

1
</activity>

2.添加 Facebook“登录”按钮

将 Facebook 登录添加到应用的最简单方法是从 SDK 添加LoginButton。这是Button的自定义视图实施。您可以在应用中使用该按钮实施 Facebook 登录。

您可以结合LoginButton使用 SDK 提供的以下类:

  • LoginManager— 使用请求的读取或发布权限开始登录流程。
  • CallbackManager— 用于将调用按指定路径发送回 Facebook SDK 及您注册的回调。您应从开始活动或onActivityResult片段调用它。
  • AccessToken:— 使用该类图谱 API 请求。它会显示用户编号以及用户接受和拒绝的权限。
  • Profile— 该类包含关于已登录用户的基本信息。

LoginButton是一个界面元素,其中包含LoginManager具备的功能。因此,当用户点击此按钮时,就会以LoginManager中设置的权限开始登录。按钮随登录状态变化,并根据用户的身份验证状态显示正确文本。

要添加 Facebook 登录按钮,请先将其添加到布局 XML 文件中,并使用完整的类名称com.facebook.widget.LoginButton:

1
2
<com.facebook.login.widget.loginbutton android:id="@+id/login_button" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_marginbottom="30dp" android:layout_margintop="30dp" android:layout_width="wrap_content">  
     </com.facebook.login.widget.loginbutton>

然后在界面中设置按钮:将按钮添加到片段中,并更新活动以使用片段。

您可以自定义Login button的属性,并在onCreateView()方法中注册一个回调。

您可以自定义的属性包括LoginBehavior、DefaultAudience、ToolTipPopup.Style以及LoginButton的相关权限。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Override
public View onCreateView(
        LayoutInflater inflater,
        ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.splash, container, false);
 
    loginButton = (LoginButton) view.findViewById(R.id.login_button);
    loginButton.setReadPermissions("email");
    // If using in a fragment
    loginButton.setFragment(this);   
    // Other app specific specialization
 
    // Callback registration
    loginButton.registerCallback(callbackManager, new FacebookCallback<loginresult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            // App code
        }
 
        @Override
        public void onCancel() {
            // App code
        }
 
        @Override
        public void onError(FacebookException exception) {
            // App code
        }
    });   
}</loginresult>

如果您在片段中使用LoginButton,需要通过调用setFragment来设置按钮上的片段,如图所示。

之后您需要调用FacebookSdk.sdkInitialize来初始化 SDK,然后调用CallbackManager.Factory.create来创建回调管理器,以便处理登录响应。以下是在片段中添加回调的示例:

1
2
3
4
5
6
7
8
9
10
public class MainActivity extends FragmentActivity {
    CallbackManager callbackManager;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();
        LoginButton loginButton = (LoginButton) view.findViewById(R.id.usersettings_fragment_login_button);
        loginButton.registerCallback(callbackManager, new FacebookCallback<loginresult>() { ... });
    }</loginresult>

最后您应调用callbackManager.onActivityResult,以便通过callbackManager将登录结果传递至LoginManager。

3.注册回调

为了响应登录结果,您需要使用LoginManager或LoginButton注册回调。如果您使用LoginButton注册回调,就不需要在登录管理器中注册回调。

将回调添加到活动或片段的onCreate()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(this.getApplicationContext());
 
    callbackManager = CallbackManager.Factory.create();
 
    LoginManager.getInstance().registerCallback(callbackManager,
            new FacebookCallback<loginresult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    // App code
                }
 
                @Override
                public void onCancel() {
                     // App code
                }
 
                @Override
                public void onError(FacebookException exception) {
                     // App code  
                }
    });
}</loginresult>

如果登录成功,LoginResult参数将拥有新的AccessToken及最新授予或拒绝的权限。

您不需要registerCallback来保证登录成功,可以选择使用下述AccessTokenTracker类跟踪当前访问口令的更改。

之后在onActivityResult()中,将登录结果转发到在onCreate()中创建的callbackManager:

1
2
3
4
5
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}

您集成到 FacebookSDK 登录或分享的所有活动和片段都应将onActivityResult转发给 callbackManager

-------------------------------------------------------------------facebook文档结束------------------------------------------------

如上的步骤就可以了吗?答案是NO,原因是因为我们还没有配置SDK。那我们就接着配置Facebook的SDK呗。

然后一定需要配置SDK,一定要配置Key Hashes。否则当您授权时就会出现错误。

所提供的网址不被应用程序配置所接纳

配置完之后我们就可以登录授权Facebook了。

然后开始看我写的代码:

在您的Application活着是第一个界面中添加如下代码,就实现了Facebook和Twitter的初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FacebookSdk.sdkInitialize(getApplicationContext());
        AppEventsLogger.activateApp(this);
        TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
        Fabric.with(this, new Twitter(authConfig));
        try {
            //facebook获取测试包的SHA秘钥
            PackageInfo info = getPackageManager().getPackageInfo(
                    "com.dora.feed",
                    PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                SysoutUtil.out("KeyHash:" + Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (PackageManager.NameNotFoundException e) {
 
        } catch (NoSuchAlgorithmException e) {
 
        }

然后我们就需要添加登录代码块了,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
     * FaceBook登录
     */
    public void LoginFaceBook(){
        List<string> permissions = Arrays.asList("public_profile", "user_friends", "user_status");
 
        LoginManager.getInstance().logInWithReadPermissions(activity, permissions);
        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<loginresult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code
                SysoutUtil.out("logingResult:" + loginResult);
                AccessToken accessToken = loginResult.getAccessToken();
                GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
                   @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                        //获取登录成功之后的用户详细信息
                        SysoutUtil.out("JSONObject:" + object);
                        String facebook_id = object.optString("id");
                        String facebook_name = object.optString("name");
                        String picture = object.optString("picture");
                        String imageUrl = null;
                        try {
                            JSONObject jsonObject = new JSONObject(picture);
                            String data = jsonObject.getString("data");
                            imageUrl = new JSONObject(data).getString("url");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                     }
                });
 
                //包入你想要得到的資料 送出request
                Bundle parameters = new Bundle();
                parameters.putString("fields", DEFAULT_REQUEST_VALUE);
                request.setParameters(parameters);
                request.executeAsync();
            }
 
            @Override
            public void onCancel() {
                SysoutUtil.out("onCancel:");
            }
 
            @Override
            public void onError(FacebookException exception) {
                // App code
                SysoutUtil.out("onError:");
            }
        });
    }
</loginresult></string>

在点击Facebook登录按钮的地方调用此方法就可以实现登录了,并且能获取到您需要的用户信息

接着我们需要回调,如下:

1
2
3
4
5
6
7
8
9
10
11
12
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(callbackManager != null){ //facebook的回调
            callbackManager.onActivityResult(requestCode, resultCode, data);
        }
        if(loginButton != null){    //twitter的回调
            loginButton.onActivityResult(requestCode, resultCode, data);
        }
 
        SysoutUtil.out("data:" + data);
    }
  到此facebook的登录就完成了!!!!!

然后我们再看分享的具体代码实现,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
     * 分享到facebook
     */
    private CallbackManager callBackManager;
 
    public void shareFaceBook() {
        Bitmap image = BitmapFactory.decodeResource(getResources(), com.dora.feed.R.drawable.app_logo);
        callBackManager  = CallbackManager.Factory.create();
        new FaceBookShareUtils(this,callBackManager,facebookCallback)
                .share(getResources().getString(R.string.app_name),
                        image,
                        getResources().getString(R.string.share_tips_tips));
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.dora.feed.utils;
 
/**
 * Created by wangkai on 16/9/3.
 */
 
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
 
import com.dora.feed.net.Api;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.share.ShareApi;
import com.facebook.share.model.ShareHashtag;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.model.SharePhoto;
import com.facebook.share.model.SharePhotoContent;
import com.facebook.share.widget.ShareDialog;
 
/**
 * facebook分享工具类
 * Created by Song on 2016/7/5.
 * Email:songxueliang@huiqu.co
 */
public class FaceBookShareUtils {
 
    private Activity mActivity ;
    private ShareDialog shareDialog;
    private CallbackManager callBackManager;
    public static final int SHARE_REQUEST_CODE = 10010;
    private ShareLinkContent.Builder shareLinkContentBuilder;
 
    public FaceBookShareUtils(Activity activity, CallbackManager callBackManager, FacebookCallback facebookCallback) {
        this.mActivity = activity ;
        this.callBackManager = callBackManager;
        shareDialog = new ShareDialog(mActivity);
        //注册分享状态监听回调接口
        shareDialog.registerCallback(callBackManager, facebookCallback, FaceBookShareUtils.SHARE_REQUEST_CODE);
        shareLinkContentBuilder = new ShareLinkContent.Builder();
    }
 
    /**
     * 分享
     */
    public void share(String contentTitle,String imageUrl,String desc) {
 
        shareLinkContentBuilder.setContentTitle(contentTitle)
                .setImageUrl(Uri.parse(imageUrl))
                .setContentDescription(desc)
                .setContentUrl(Uri.parse(Api.SHARE_LEFT_URL));
        ShareLinkContent shareLinkContent = shareLinkContentBuilder.build();
        if(shareDialog.canShow(ShareLinkContent.class)) {
            shareDialog.show(mActivity,shareLinkContent);
 
        }
    }
    /**
     * 分享
     */
    public void share(String contentTitle, Bitmap imageUrl,String desc) {
 
//        SharePhoto photo = new SharePhoto.Builder()
//                .setBitmap(imageUrl)
//                .setCaption(desc)
//                .build();
//
//        SharePhotoContent content = new SharePhotoContent.Builder()
//                .addPhoto(photo)
////                .setContentUrl(Uri.parse(Api.SHARE_LEFT_URL))
//                .build();
//
//        ShareApi.share(content, null);
//        if(shareDialog.canShow(SharePhotoContent.class)) {
//            shareDialog.show(mActivity,content);
//        }
        if (shareDialog.canShow(ShareLinkContent.class)) {
 
            ShareLinkContent linkContent = new ShareLinkContent.Builder()
                    .setContentTitle(contentTitle)
                    .setContentDescription(desc)
                    .setContentUrl(Uri.parse(Api.SHARE_LEFT_URL))
 
//                    .setImageUrl(Uri.parse("android.resource://de.ginkoboy.flashcards/" + com.dora.feed.R.drawable.app_logo))
                    .setImageUrl(Uri.parse("http://bagpiper-andy.de/bilder/dudelsack%20app.png"))
                    .build();
 
            shareDialog.show(linkContent);
        }
 
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
     * facebook分享状态回调
     */
    private FacebookCallback facebookCallback = new FacebookCallback() {
 
        @Override
        public void onSuccess(Object o) {
            SysoutUtil.out("onSuccess" + o.toString());
//            Message msg = Message.obtain();
//            msg.what = SHARE_COMPLETE;
//            mHandler.sendMessage(msg);
        }
 
        @Override
        public void onCancel() {
            SysoutUtil.out("onCancel");
//            Message msg = Message.obtain();
//            msg.what = SHARE_CANCEL;
//            mHandler.sendMessage(msg);
        }
 
        @Override
        public void onError(FacebookException error) {
            SysoutUtil.out("onError");
            ToastUtils.showToast("share error--" + error.getMessage());
//            Message msg = Message.obtain();
//            msg.what = SHARE_ERROR;
//            mHandler.sendMessage(msg);
        }
    };
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 
        if(PromptUtils.isProgressDialogShowing()){
            PromptUtils.dismissProgressDialog();
        }
 
        if(FaceBookShareUtils.SHARE_REQUEST_CODE == requestCode) {
            callBackManager.onActivityResult(requestCode,resultCode,data);
        }else if(requestCode == TWEET_COMPOSER_REQUEST_CODE){
            SysoutUtil.out("onActivityResult");
            ToastUtils.showToast("share success");
        }
//        callBackManager.onActivityResult(requestCode,resultCode,data);
    }

好了,按照以上步骤,您的facebook登录和分享就可以成功了,休息下咱们再开始写twitter的登录和注册。。。。。。。。。。。。。

Twitter登录和分享

Twitter本人研究了三天,看各种文档,twitter的源码,最后才实现了

首先还是看文档:

Twitter的文档很不好找,https://www.fabric.io/kits/android/twitterkit/install

在文档中可以很清楚的看到,应该如何配置Fabric

看我的代码具体实现:

首先配置项目的build.gradle(也就是最外边的一个gradle)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'io.fabric.tools:gradle:1.+'
    }
}
 
allprojects {
    repositories {
        jcenter()
    }
}
 
task clean(type: Delete) {
    delete rootProject.buildDir
}

其次是配置您的应用的 module的build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
apply plugin: 'com.android.application'
// This does not break the build when Android Studio is missing the JRebel for Android plugin.
apply plugin: 'io.fabric'
 
repositories {
    maven { url 'https://maven.fabric.io/public' }
}
android {
    compileSdkVersion 23
    buildToolsVersion '23.0.1'
 
    defaultConfig {
        applicationId "com.
aaa.feed"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
//    productFlavors.all {
//        flavor -> flavor.manifestPlaceholders = [CHANEL_ID_VALUE: name]
//    }
    lintOptions {
        abortOnError false
    }
    dataBinding {
        enabled = true
    }
}
 
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(':famlinkFrame')
    compile project(':PushSDK')
    compile 'tv.danmaku.ijk.media:ijkplayer-java:0.5.1'
    compile('com.twitter.sdk.android:twitter:2.0.0@aar') {
        transitive = true;
    }
    compile('com.twitter.sdk.android:tweet-composer:0.9.0@aar') {
        transitive = true;
    }
}

然后重新clear您的Android studio,这样Fabric就可以自动下载twitter的jar包了。

下载完成之后咱们要做的就是开始写代码:

Twitter的初始化在前边的代码中已经有体现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
     * Twitter登录
     */
    private void LoginTwitter(){
        loginButton.setCallback(new Callback<twittersession>() {
            @Override
            public void success(Result<twittersession> result) {
 
                TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient();
                Call<user> call =  twitterApiClient.getAccountService().verifyCredentials(false, false);
                call.enqueue(new Callback<user>() {
                    @Override
                    public void success(Result<user> result) {
 
                        String dataResult = "Name: " + result.data.name +
                                "\nScreenName: " + result.data.screenName +
                                "\nProfileImage: " + result.data.profileImageUrl +
                                "\nBackgroungUrl" + result.data.profileBannerUrl +
                                "\nCreated at" + result.data.createdAt +
                                "\nDescription" + result.data.description +
                                "\nEmail" + result.data.email+
                                "\nFriends Count" + result.data.friendsCount;
                        System.out.println(result.data.profileImageUrl);
 
                        String twitter_id = String.valueOf(result.data.id);
                        String twitter_name = result.data.name;
                        CacheUtils.getInstance().putString(LocalContents.ACCESS_TOKEN, "twitter"+twitter_id);
                        String[] str  = {twitter_name, result.data.profileImageUrl};
 
                        CacheUtils.getInstance().putString(LocalContents.LOGIN_USER_NAME, str[0]);
                        CacheUtils.getInstance().putString(LocalContents.LOGIN_USER_HEAD, str[1]);
                        DataChangeNotification.getInstance().notifyDataChanged(IssueKey.CLOSE_LOGIN_ACTIVITY);
                        DataChangeNotification.getInstance().notifyDataChanged(IssueKey.UPDATEHEAD, str);
//                        TwitterAuthToken token = session.getAuthToken();
                    }
 
                    @Override
                    public void failure(TwitterException exception) {
                        System.out.println(exception.getMessage());
                    }
                });
            }
            @Override
            public void failure(TwitterException exception) {
                SysoutUtil.out("TwitterKit" + "Login with Twitter failure" + exception);
            }
        });</user></user></user></twittersession></twittersession>

到此处登录就完成了,并且您的头像以及各种信息都能取到,本人逛了很多国外网站都说通过 接口的形式来重新获取用户信息,然后twitter官方也建议这么做,但是在我用的时候接口一直返回“215”,本人试了不下上百次,把该接口各种配置,但是怎么都返回215,215的大致意思是我需要重新验证身份,那我就想不通了,我再登录之前肯定验证身份了,不知道是为啥,最后我实在崩溃了;

我就想既然这种方法实现不了,那我就换种思路,程序员最重要的一点就是要能看代码,那我索性就看twitter jar包的源码了,果然看源码还是很有用的,最后发现twitter中的用户信息存储在User类下,然后我只需要获取到User的数据不就行了,然后就是一步一步的开始看源码,最后终于找到解决方案了如下图,

到此为止,我们的登录就算完整了,用户的所有信息想怎么取就怎么取。

最后我们在做分享

分享很简单,我就不做解释了,直接将本方法拷入代码,调用就可以:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
     * 分享到Twitter
     * @throws MalformedURLException
     */
    private void shareTweet() throws MalformedURLException {
//        final long tweetId = 771558172175716352L;
//        TweetComposer.Builder builder = new TweetComposer.Builder(this)
//                .text(getResources().getString(R.string.share_tips_tips))
//                .url(new URL(Api.SHARE_LEFT_URL));
//       Intent intent = builder.createIntent();
 
//        builder.show();
//        startActivityForResult(intent, 1000);
        Intent intent = null;
        try {
            intent = new TweetComposer.Builder(this)
                    .text("标题"
                    .url(new URL("您的URL"))
                    .image(getHeaderIconUri())
                    .createIntent();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        startActivityForResult(intent, TWEET_COMPOSER_REQUEST_CODE);
    }
    public Uri getHeaderIconUri(){   //要上传的图片
        Resources r =  getApplicationContext().getResources();
        return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
                + r.getResourcePackageName(com.dora.feed.R.drawable.app_logo) + "/"
                + r.getResourceTypeName(com.dora.feed.R.drawable.app_logo) + "/"
                + r.getResourceEntryName(com.dora.feed.R.drawable.app_logo));
    }

终于搞定,根据以上方式,facebook登录,分享 twitter登录和分享完美实现。本人能力有限,写的比较粗糙,要是有问题请留言,本人再优化

失败是什么?没有什么,只是更走近成功一步;成功是什么?就是走过了所有通向失败的路,只剩下一条路,那就是成功的路。

Android Facebook和Twitter登录和分享完整版的更多相关文章

  1. Android版的疯狂猜图游戏源码完整版分享

    这个游戏源码是在安装教程网那么分享过来的,Android版的疯狂猜图游戏源码完整版分享,也是本人之前很早以前发的一款游戏源码的,大家如果想了解一下,可以看看吧,不说多了,上一个图先吧.   > ...

  2. Android宝宝点点乐游戏源码完整版

    Android宝宝点点乐游戏源码完整版,是我从其他网站转载过来的,就是那个安卓教程网,该游戏目前已经上线了百度应用商店了,大家可以去搜索一下,看看演示吧. <ignore_js_op> & ...

  3. Android Facebook和Twitter分享

    1. 背景 在年初的时候,公司的项目有个新的需求,在英文版的应用中加入Facebook和Twitter分享功能. 2. 完成情况 由于这个项目比较急,所以开发这个功能从预研到接入总共耗时一周.后来,在 ...

  4. Twitter 登录和分享

    继上面一片介绍了FaceBook的登录和分享,现在再来实现Twitter的登录和分享. 1.首先要说明的是,我没找到官方提供的SDK,查阅很多文章都提到了一个帮助实现的包Twitter4j.jar   ...

  5. Android掌中游斗地主游戏源码完整版

    源码大放送-掌中游斗地主(完整版),集合了单机斗地主.网络斗地主.癞子斗地主等,有史以来最有参考价值的源码,虽然运行慢了一点但是功能正常,用的是纯java写的. 项目详细说明:http://andro ...

  6. facebook和twitter的截图分享

    记录一下代码,以后自己可以抄..我抄我自己=.= SDK的接入看之前的博客.所以话不多少,直接上代码(记得分享一定要安装原生app(FB和twitter),不然只通过网页分享无法发图片.),初始化都在 ...

  7. PHP+MySQL登录注册,完整版,详细注释

    纯手写打造. 下载地址:http://download.csdn.net/detail/qq_33599520/9779970 项目结构: 下面是代码: <!DOCTYPE html> & ...

  8. 使用facebook和twitter进行分享经验总结

    凤凰涅槃,浴火重生. 在传说当中,凤凰是人世间幸福的使者,每五百年,它就要背负着积累于在人间的所有痛苦和恩怨情仇,投身于熊熊烈火中自焚,以生命和美丽的终结换取人世的祥和与幸福.同样在肉体经受了巨大的痛 ...

  9. Facebook等使用苹果源生分享

         1.Facebook官方的SDK分享               2.ShareSDK,第三方集成的分享方式      3.网页分享方式分享      4.IOS6之后,苹果自己集成了对于F ...

随机推荐

  1. Spring发展史

    https://www.cnblogs.com/RunForLove/p/4641672.html

  2. Vue 还是 React 还是 Angular ?

    有空的时候还是把3个都熟悉一下.除了Angular学习起来笔记花时间外.React跟Vue没啥难度,学习用的时间不多. 如果你在Google工作:Angular如果你喜欢TypeScript:Angu ...

  3. KMP算法_模板_C++

    这个博客讲得非常优秀,可惜它是Java版本的 http://blog.csdn.net/yutianzuijin/article/details/11954939/ a 为匹配串,b 为目标串 通俗讲 ...

  4. [bzoj3669][Noi2014]魔法森林——lct

    Brief description 给定一个无向图,求从1到n的一条路径使得这条路径上最大的a和b最小. Algorithm Design 以下内容选自某HN神犇的blog 双瓶颈的最小生成树的感觉, ...

  5. Django【进阶】序列化

    关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 方案一:serializers 1 2 3 4 5 fromdjango.cor ...

  6. Linux下的两个经典宏定义【转】

    转自:http://www.linuxidc.com/Linux/2015-07/120014.htm 本文首先介绍Linux下的经典宏定义,感受极客的智慧,然后根据该经典定义为下篇文章作铺垫. of ...

  7. kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树

    二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j ...

  8. Chrome扩展及应用开发

    Chrome扩展及应用开发(电子书) http://www.ituring.com.cn/minibook/950 文档 官方 https://developer.chrome.com/extensi ...

  9. 【 sysbench 性能基准测试 】

    度娘解释:sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试. 目前支持的数据库支持:MySQL,pgsql,oracle 这3种数据库. 安装s ...

  10. word-wrap

    平时的网页制作中碰到过这样的情况,比如说在blog中制作了一个完美而且又靓丽的评论布局,让你的用户浏览网页是可以给你添加评论,但当有人发布了一个原始网址或者其它超长的文本时,你此时的布局就被他们给彻底 ...