Android之海外第三方登录

来源:互联网 发布:网络集成公司贵州 编辑:程序博客网 时间:2024/04/28 05:13

本文主要记录海外应用第三方登录: facebook(登录/分享), twitter(登录/分享), google(登录), Line(登录/分享),instagram(分享),属于记录流水账型的啦,谨希望后人少踩坑
当然这个需要科学上网,如何上网就不属于本文的讨论范围啦,如果你说点击不开官方教程,可以点击这个,输入框输入网址,就可以打开我能帮的只有这些了

Twitter-登录

  • twitter 资源引入,官方教程
    就是引入一个module,然后初始化twitter
  • 上一步需要注册一个twitter开发者账号(先创建一个twitter账号,然后转为开发者账号),然后新建一个项目,新建项目的地址
    新建项目很简单,但是项目需要配置一下,我测试时一直是com.twitter.sdk.android.core.TwitterException: Request Failure 就是手贱了一下,没有配置好,勾选了Enable Callback Locking
    附上正确的配置的截图
    这里写图片描述
    这里写图片描述

  • 开始登录,官方教程
    按照官方的登录教程来,处理好上面的坑,就可以了
    这里写图片描述

  • 登录成功就可以在回调里拿到登录成功用户的部分信息

    mTwitterLoginButton.setCallback(new Callback<TwitterSession>() {            @Override            public void success(Result<TwitterSession> result) {                String name = result.data.getUserName();                long userId = result.data.getUserId();                long id = result.data.getId();                TwitterAuthToken token = result.data.getAuthToken();                String secret = token.secret;                String strToken = token.token;                D.i("slack", "success name: " + name + " ,userId: " + userId + " ,id: " + id + " ,secret: " + secret + " ,token: " + strToken);                // 如果需要获取用户的详细信息,可以使用API :GET users/show            }            @Override            public void failure(TwitterException exception) {                exception.printStackTrace();                D.i("slack", "failure:" + exception.getMessage());            }        });
  • 但是这里不能获取用户的详细信息,比如用户的头像,翻阅API,发现一个请求GET users/show 这里可以只要传上一步获取到的参数,就可以获取用户信息啦

Twitter-分享

  • 分享还是必不可少的 官方文档
  • 推特目测可以分享纯文字,图片,视频链接,提供两种分享方式
    • TweetComposer.Builder
      • 安装了客户端,直接打开客户端
      • 没有安装客户端,打开系统浏览器
    • ComposerActivity.Builder().createIntent(); 不依赖于是否安装了客户端,在应用打开一个新分享界面
  • 推特的分享结果是已广播的形式回调的
    这里写图片描述
    twitter 登录(testLoginClick() 是不使用提供的按钮实现的登录)和分享部分代码

    /** * Created by slack * on 17/9/26 上午11:33 * 官网上 登录示例 : https://dev.twitter.com/twitterkit/android/log-in-with-twitter * 查询用户的详细信息: https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-show * 分享: https://dev.twitter.com/twitterkit/android/compose-tweets */public class TwitterLoginActivity extends BaseOldActivity {    public void registerTwitter(Context context) {        TwitterConfig config = new TwitterConfig.Builder(context)                .logger(new DefaultLogger(Log.DEBUG))                .twitterAuthConfig(new TwitterAuthConfig("ECTbYYuCdGuLDdUPbK9H80qvu", "csLq80NLKmbVoQIzEi2nS8PUhUqJHABSvxNsMuBIjKAloHvIHJ"))                .debug(true)                .build();        Twitter.initialize(config);    }    TwitterLoginButton mTwitterLoginButton;    @Override    protected void onCreate(Bundle savedInstanceState) {        registerTwitter(this);        this.requestWindowFeature(Window.FEATURE_NO_TITLE);        this.getWindow().setFlags(                WindowManager.LayoutParams.FLAG_FULLSCREEN,                WindowManager.LayoutParams.FLAG_FULLSCREEN);        super.onCreate(savedInstanceState);        setContentView(R.layout.acitvity_third_twitter_login);        mTwitterLoginButton = (TwitterLoginButton) findViewById(R.id.test_login_twitter);        mTwitterLoginButton.setCallback(mTwitterCallback);    }    private Callback<TwitterSession> mTwitterCallback = new Callback<TwitterSession>() {        @Override        public void success(Result<TwitterSession> result) {            String name = result.data.getUserName();            long userId = result.data.getUserId();            long id = result.data.getId();            TwitterAuthToken token = result.data.getAuthToken();            String secret = token.secret;            String strToken = token.token;            D.i("slack", "success name: " + name + " ,userId: " + userId + " ,id: " + id + " ,secret: " + secret + " ,token: " + strToken);            // 如果需要获取用户的详细信息,可以使用API :GET users/show        }        @Override        public void failure(TwitterException exception) {            exception.printStackTrace();            D.i("slack", "failure:" + exception.getMessage());        }    };    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        mTwitterLoginButton.onActivityResult(requestCode, resultCode, data);        if (mTwitterAuthClient != null && (requestCode == mTwitterAuthClient.getRequestCode())) {            mTwitterAuthClient.onActivityResult(requestCode, resultCode, data);        }    }    /**     * share ,没有客户端,打开的是系统的浏览器,用户的登录session ,暂时无法传     * 不知道是不是没有客户端的缘故,无法发图片     * 图片uri : the image Uri should be a Uri using the content:// scheme.     */    public void testShareClick(View view) {        URL url;        try {            url = new URL("https://www.google.com");        } catch (MalformedURLException e) {            e.printStackTrace();            url = null;        }        Uri uri = obtainUri();        TweetComposer.Builder builder = new TweetComposer.Builder(this)                .text("this is a test");        if (uri != null) {            builder.image(uri);        }        if (url != null) {            builder.url(url);        }        builder.show();    }    public void testShareClick2(View view) {        Uri uri = obtainUri();        TwitterSession session = TwitterCore.getInstance().getSessionManager()                .getActiveSession();        ComposerActivity.Builder builder  = new ComposerActivity.Builder(this)                .session(session)                .text("Love where you work")                .hashtags("#twitter");        if(uri != null) {            builder.image(uri);        }        Intent intent  = builder.createIntent();        startActivity(intent);    }    private Uri obtainUri() {        String filePath = new File(Environment.getExternalStorageDirectory(), "test.jpg").getAbsolutePath();        Uri mUri = Uri.parse("content://media/external/images/media");        Uri imageUri = null;        Cursor cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null,                null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);        cursor.moveToFirst();        while (!cursor.isAfterLast()) {            String data = cursor.getString(cursor                    .getColumnIndex(MediaStore.MediaColumns.DATA));            if (filePath.equals(data)) {                int ringtoneID = cursor.getInt(cursor                        .getColumnIndex(MediaStore.MediaColumns._ID));                imageUri = Uri.withAppendedPath(mUri, ""                        + ringtoneID);                break;            }            cursor.moveToNext();        }        return imageUri;    }    public void testSessionClick(View view) {        TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession();        String name = session.getUserName();        long userId = session.getUserId();        long id = session.getId();        TwitterAuthToken authToken = session.getAuthToken();        String token = authToken.token;        String secret = authToken.secret;        D.i("slack", "success name: " + name + " ,userId: " + userId + " ,id: " + id + " ,secret: " + secret + " ,token: " + token);    }    /**     * 嘘,其实就是复制 TwitterLoginButton 里登录的代码啦     */    TwitterAuthClient mTwitterAuthClient;    public void testLoginClick(View view) {        if (this.isFinishing()) {            return;        }        if (mTwitterAuthClient == null) {            mTwitterAuthClient = new TwitterAuthClient();        }        mTwitterAuthClient.authorize(this, mTwitterCallback);    }}

Facebook-登录

  • 可以直接参照 官方教程,申请账号,新建application, 就是有一点需要注意,facebookSDK需要先初始化,要不然会报错
    FacebookSdk.setApplicationId("Your facebook application id");
    FacebookSdk.sdkInitialize(getApplicationContext());

    如果还不会使用,可以查看facebook的github,里面有demo

  • 新建application, 需要提供包名,Key Hashes, 最好你也走一遍Quick Start

  • 还有一个坑,在引入依赖库时,按照github上写,反正我的是报错,没有加载到文件,可以这么写,这段代码是从这里看到的

        compile 'com.facebook.android:facebook-core:[4,5)'    compile 'com.facebook.android:facebook-login:[4,5)'    compile 'com.facebook.android:facebook-share:[4,5)'    compile 'com.facebook.android:facebook-places:[4,5)'    compile 'com.facebook.android:facebook-messenger:[4,5)'    compile 'com.facebook.android:facebook-applinks:[4,5)'

    完善上面的步骤,就可以成功调用facebook的登录界面
    这里写图片描述

    • 获取用户信息,facebook也给我们提供了接口,User 官方文档,参数提供登录获取到的用户Id即可

Facebook-分享

  • 可以直接参照 官方教程
  • 直接分享会报错onError: (#200) Requires extended permission: publish_actions 这个还是permissions设置的问题,官方教程, 登录时加上获得发布权限即可,比如
    LoginManager.getInstance().logInWithPublishPermissions(fragmentOrActivity, Arrays.asList("publish_actions"));
    这个就需要用户配合了,需要获得权限,如果用户点击了取消,就没有权限,无法分享,不过facebook考虑到了这种情况,可 重新申请权限,即调用上面的登录代码即可
    这里写图片描述
    看一张分享成功的图这里写图片描述

  • facebook 登录和分享的核心代码

    /** * Created by slack * on 17/9/26 下午12:36 * 登录:https://developers.facebook.com/docs/facebook-login/android * 获取用户信息:参数userId  https://developers.facebook.com/docs/graph-api/reference/user * 分享: https://developers.facebook.com/docs/sharing/android/ */public class FacebookLoginActivity extends BaseOldActivity{    CallbackManager mCallbackManager;    private LoginManager mLoginManager;    private LoginButtonProperties mLoginButtonProperties = new LoginButtonProperties();    private void initFacebook() {        FacebookSdk.setApplicationId("1718752355099106");        FacebookSdk.sdkInitialize(getApplicationContext());    }    @Override    protected void onCreate(Bundle savedInstanceState) {        initFacebook();        super.onCreate(savedInstanceState);        mCallbackManager = CallbackManager.Factory.create();        mLoginManager = LoginManager.getInstance();        setContentView(R.layout.acitvity_third_facebook_login);        ((LoginButton) findViewById(R.id.test_login_facebook)).registerCallback(mCallbackManager, mFacebookCallback);    }    private FacebookCallback<LoginResult> mFacebookCallback = new FacebookCallback<LoginResult>() {        @Override        public void onSuccess(LoginResult loginResult) {            AccessToken accessToken = loginResult.getAccessToken();            String token = accessToken.getToken();            String userId = accessToken.getUserId();            accessToken = AccessToken.getCurrentAccessToken();            String token2 = accessToken.getToken();            String userId2 = accessToken.getUserId();             D.i("slack", "onSuccess token: " + token + " ,userId: " + userId + " token2: " + token2 + " ,userId2: " + userId2);        }        @Override        public void onCancel() {            D.i("slack", "onCancel");        }        @Override        public void onError(FacebookException error) {            error.printStackTrace();            D.i("slack", "onError" + error.getMessage());        }    };    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        mCallbackManager.onActivityResult(requestCode, resultCode, data);    }    public void testLoginClick(View view) {        LoginManager loginManager = getLoginManager();        if (LoginAuthorizationType.PUBLISH.equals(mLoginButtonProperties.authorizationType)) {            loginManager.logInWithPublishPermissions(                    this,                    mLoginButtonProperties.permissions);        } else {            loginManager.logInWithReadPermissions(                    this,                    mLoginButtonProperties.permissions);        }    }    private LoginManager getLoginManager() {        LoginManager manager = LoginManager.getInstance();        manager.setDefaultAudience(mLoginButtonProperties.getDefaultAudience());        manager.setLoginBehavior(mLoginButtonProperties.getLoginBehavior());        return manager;    }    /**     * 照片大小必须小于 12MB     * 用户需要安装版本 7.0 或以上的原生 Android 版 Facebook 应用     */    public void testShareImageClick(View view) {        Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.wutaicon);        SharePhoto photo = new SharePhoto.Builder()                .setBitmap(image)                .build();        SharePhotoContent content = new SharePhotoContent.Builder()                .addPhoto(photo)                .build();        ShareApi.share(content, mShareCallback);    }    private FacebookCallback<Sharer.Result> mShareCallback = new FacebookCallback<Sharer.Result>() {        @Override        public void onSuccess(Sharer.Result result) {            D.i("slack", "onSuccess: " + result.getPostId());        }        @Override        public void onCancel() {            D.i("slack", "onCancel");        }        @Override        public void onError(FacebookException error) {            D.i("slack", "onError: " + error.getMessage());        }    };    /**     * 视频大小必须小于 12MB     */    public void testShareVideoClick(View view) {        Uri videoUrl = null;        ShareVideo video = new ShareVideo.Builder()                .setLocalUrl(videoUrl)                .build();        ShareVideoContent content = new ShareVideoContent.Builder()                .setVideo(video)                .build();        ShareApi.share(content, mShareCallback);    }    static class LoginButtonProperties {        private DefaultAudience defaultAudience = DefaultAudience.FRIENDS;        private List<String> permissions = new ArrayList<>();        private LoginAuthorizationType authorizationType = null;        private LoginBehavior loginBehavior = LoginBehavior.NATIVE_WITH_FALLBACK;        LoginButtonProperties() {            permissions.add("publish_actions");            authorizationType = LoginAuthorizationType.PUBLISH;        }        public void setDefaultAudience(DefaultAudience defaultAudience) {            this.defaultAudience = defaultAudience;        }        public DefaultAudience getDefaultAudience() {            return defaultAudience;        }        public void setReadPermissions(List<String> permissions) {            if (LoginAuthorizationType.PUBLISH.equals(authorizationType)) {                throw new UnsupportedOperationException("Cannot call setReadPermissions after " +                        "setPublishPermissions has been called.");            }            this.permissions = permissions;            authorizationType = LoginAuthorizationType.READ;        }        public void setPublishPermissions(List<String> permissions) {            if (LoginAuthorizationType.READ.equals(authorizationType)) {                throw new UnsupportedOperationException("Cannot call setPublishPermissions after " +                        "setReadPermissions has been called.");            }            if (Utility.isNullOrEmpty(permissions)) {                throw new IllegalArgumentException(                        "Permissions for publish actions cannot be null or empty.");            }            this.permissions = permissions;            authorizationType = LoginAuthorizationType.PUBLISH;        }        List<String> getPermissions() {            return permissions;        }        public void clearPermissions() {            permissions = null;            authorizationType = null;        }        public void setLoginBehavior(LoginBehavior loginBehavior) {            this.loginBehavior = loginBehavior;        }        public LoginBehavior getLoginBehavior() {            return loginBehavior;        }    }}
  • 2017-10-18更新一处代码,faceboo分享时使用界面分享
    /**     * 带界面的分享     * 替换 ShareApi.share(content, mShareCallback);     */    private void share(ShareContent content) {        ShareButton shareButton = new ShareButton(this);        shareButton.setShareContent(content);        shareButton.registerCallback(mCallbackManager, mShareCallback);        shareButton.callOnClick();    }    CallbackManager mCallbackManager;    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        mCallbackManager.onActivityResult(requestCode, resultCode, data);    }

Google 账号登录

  • 添加Google登录到我们的应用官方教程,如果不够直接,直接上google的demo,google还是狠直接呀,show you the code
  • 按照官方的教程,先下载测试代码,然后创建一个应用(先注册google开发者账号),提供应用的Name,包名,创建成功就可以看见下面的界面

    这里写图片描述

  • 在这一步,我只需要登录(Sign-In),需要提供SHA-1,教程下面有获取方式,这个可以直接过。然后点击 [Generate Configuration files], 下载google的配置文件 google-services.json,复制到项目里

    这里写图片描述

  • 然后会回到 start 界面,此时 第二步的configured=true,直接跳过下面的步骤,去第七步,Add Sign-In To Your App, 下面就是添加项目的依赖,这个截图是官方的教程,上面的版本号不是最新的,最新的可以参考google的demo

    这里写图片描述

  • 由于我跳过了一步,没有下载google的repository,出现了下面的截图,不要紧,下载就好了
    这里写图片描述

    这里写图片描述

  • 由于新建工程时给google提供的是本机的SHA-1, build.gradle里只要没有设置过签名,运行起来是没有问题的,GoogleSignInAccount, 可以直接获取到用户的部分信息,我遇到的问题是GoogleSignInResult.isSuccess() == false, 原因就是给google 提供测试的SHA-1,但是编译签名时使用的另一套,导致的失败,修改就好啦
    这里写图片描述

    附上Google登录部分的核心代码

    public class GoogleLoginActivity extends AppCompatActivity implements        GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks,        View.OnClickListener {    private static final String TAG = "SignInActivity";    private static final int RC_SIGN_IN = 9001;    private GoogleApiClient mGoogleApiClient;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.acitvity_third_google_login);        // Button listeners        findViewById(R.id.sign_in_button).setOnClickListener(this);        findViewById(R.id.sign_out_button).setOnClickListener(this);        findViewById(R.id.disconnect_button).setOnClickListener(this);        // [START configure_signin]        // Configure sign-in to request the user's ID, email address, and basic        // profile. ID and basic profile are included in DEFAULT_SIGN_IN.        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)                .requestEmail()                .requestId()                .build();        // [END configure_signin]        // [START build_client]        // Build a GoogleApiClient with access to the Google Sign-In API and the        // options specified by gso.        mGoogleApiClient = new GoogleApiClient.Builder(this)                .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)                .addConnectionCallbacks(this)                .build();        // [END build_client]    }    @Override    public void onStart() {        super.onStart();        if(mGoogleApiClient!=null) {            mGoogleApiClient.connect();        }    }    // [START onActivityResult]    @Override    public void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);        if (requestCode == RC_SIGN_IN) {            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);            handleSignInResult(result);        }    }    // [END onActivityResult]    // [START handleSignInResult]    private void handleSignInResult(GoogleSignInResult result) {        Log.d(TAG, "handleSignInResult:" + result.isSuccess());        if (result.isSuccess()) {            // Signed in successfully, show authenticated UI.            GoogleSignInAccount acct = result.getSignInAccount();            if(acct != null) {                Log.i(TAG, "用户名是:" + acct.getDisplayName() + " ,用户email是:" + acct.getEmail() +                        " ,用户头像是:" + acct.getPhotoUrl() + " ,用户Id是:" + acct.getId() + " ,用户IdToken是:" + acct.getIdToken());            }        }    }    // [END handleSignInResult]    // [START signIn]    private void signIn() {        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);        startActivityForResult(signInIntent, RC_SIGN_IN);    }    // [END signIn]    // [START signOut]    private void signOut() {        Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(                new ResultCallback<Status>() {                    @Override                    public void onResult(Status status) {                        Log.i(TAG, "signOut:" + status.getStatusMessage());                    }                });    }    // [END signOut]    // [START revokeAccess]    private void revokeAccess() {        Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback(                new ResultCallback<Status>() {                    @Override                    public void onResult(Status status) {                        Log.i(TAG, "revokeAccess:" + status.getStatusMessage());                    }                });    }    // [END revokeAccess]    @Override    public void onConnectionFailed(ConnectionResult connectionResult) {        // An unresolvable error has occurred and Google APIs (including Sign-In) will not        // be available.        Log.d(TAG, "onConnectionFailed:" + connectionResult);    }    @Override    public void onConnected(@Nullable Bundle bundle) {            Log.i("slack","onConnected,bundle==" + bundle);            }    @Override    public void onConnectionSuspended(int i) {            Log.i("slack","onConnectionSuspended,i:" + i);            }    @Override    protected void onStop() {        super.onStop();        if (mGoogleApiClient!=null&&mGoogleApiClient.isConnected()) {            mGoogleApiClient.disconnect();        }    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.sign_in_button:                signIn();                break;            case R.id.sign_out_button:                signOut();                break;            case R.id.disconnect_button:                revokeAccess();                break;        }    }}

Line 登录

  • Line提供的是arr 资源,登录也是提供很好的API,官方登录教程
  • 按照官方教程来就好了,成为开发者,创建一个应用获取一个channeld, 我在”App settings” 页面只设置了Android package name,这个是必须的,就是你的应用包名,Line的SDK是以 .arr 格式给的,放到libs 里
  • 登录部分代码

    try{        // App-to-app login        Intent loginIntent = LineLoginApi.getLoginIntent(this, "your channelId");        startActivityForResult(loginIntent, REQ_LOGIN);    }    catch(Exception e) {        Log.e("slack", "Error: " + e.toString());    }

    登录的结果获取

    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        if(requestCode == REQ_LOGIN) {            LineLoginResult result = LineLoginApi.getLoginResultFromIntent(data);            switch (result.getResponseCode()) {                case SUCCESS:                    // Login successful, 会有一个内部的toast,我们无需处理                    Log.e("slack", "LINE Login success  lineProfile: " + result.getLineProfile() + " line_credential: " + result.getLineCredential());                    break;                case CANCEL:                    // Login canceled by user                    Log.e("slack", "LINE Login Canceled by user!!");                    break;                default:                    // SERVER_ERROR     The login failed due to a server-side error.                    // NETWORK_ERROR    The login failed because the SDK could not connect to the LINE Platform.                    // INTERNAL_ERROR   The login failed due to an unknown error.                    Log.e("slack", "Login FAILED!" + result.getErrorData().toString());            }        }    }
  • 登录部分狠顺利,顺便提供一份github上line的登录demo

    这里写图片描述

    这里写图片描述

Line 分享

  • 分享部分开始踩坑,登录创建的channelId是不能用的,分享同登录是分开的, 重新建一个message 就是了,不过分享的api提供的是web 端接口,android 和ios端没有找到文档,郁闷了,难道是我没有找到?
  • 有一个line传送,看了一下,这个适合写文章啥的网页分享,line确实提供了很好的js代码注入,奈何不适合客户端呀
  • 目前还没有找到合适的方式,只能考虑前辈的思路,本地分享,在此表示感谢,分享是么有问题的,本地分享的话,都不需要上面的新建channelId了

    这里写图片描述

    这里写图片描述

    附上主要代码

        /** * Created by slack * on 17/10/10 下午3:14 * from: https://developers.line.me/en/docs/line-login/android/integrate-line-login/ * 用户信息 : https://developers.line.me/en/docs/social-api/getting-user-profiles/ *      不全,只能用户id,昵称,头像,这些登录成功后android端也可以获取到 {@link LineProfile} * 分享: https://developers.line.me/en/docs/messaging-api/overview/ 但是是JS的。。。 */public class LineLoginActivity extends BaseOldActivity {    private static final int REQ_LOGIN = 0x01;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.acitvity_third_line_login);    }    public void testLoginClick(View view) {        try{            // App-to-app login            Intent loginIntent = LineLoginApi.getLoginIntent(this, "1539990963");            startActivityForResult(loginIntent, REQ_LOGIN);        }        catch(Exception e) {            Log.e("slack", "Error: " + e.toString());        }        // logout//        LineApiClientBuilder apiClientBuilder = new LineApiClientBuilder(getApplicationContext(), "your channelId");//        LineApiClient lineApiClient = apiClientBuilder.build();//        lineApiClient.logout();    }    /**     * 分享功能     *  ComponentName(String pkg, String cls)     *  line的包名,line的接收资料的类名--》 </intent-filter> MainFist里面     */    public void testShareImageClick(View view) {        ComponentName cn = new ComponentName("jp.naver.line.android"                , "jp.naver.line.android.activity.selectchat.SelectChatActivity");        Intent shareIntent = new Intent();        shareIntent.setAction(Intent.ACTION_SEND);        Uri uri = obtainUri(false,                new File(Environment.getExternalStorageDirectory(), "test.jpg").getAbsolutePath());        shareIntent.putExtra(Intent.EXTRA_STREAM, uri);        shareIntent.setType("image/jpeg"); //图片分享        //intent.setType("text/plain"); // 纯文本        //intent.setType("video/*"); // video        //intent.putExtra(Intent.EXTRA_SUBJECT, "分享的标题");        //intent.putExtra(Intent.EXTRA_TEXT, "分享的内容");        shareIntent.setComponent(cn);//跳到指定APP的Activity        startActivity(Intent.createChooser(shareIntent,""));    }    /**     * 同图片分享,不过是本地分享     * 测试19M 视频没有问题,45M的也没有问题,传递的是Uri,应该跟视频大小没有关系,暂时没有查到line 限制的视频大小     */    public void testShareVideoClick(View view) {        ComponentName cn = new ComponentName("jp.naver.line.android"                , "jp.naver.line.android.activity.selectchat.SelectChatActivity");        Intent shareIntent = new Intent();        shareIntent.setAction(Intent.ACTION_SEND);        Uri uri = obtainUri(true,                new File(Environment.getExternalStorageDirectory(), "test.mp4").getAbsolutePath());        shareIntent.putExtra(Intent.EXTRA_STREAM, uri);        shareIntent.setType("video/*"); // video        shareIntent.setComponent(cn);//跳到指定APP的Activity        startActivity(Intent.createChooser(shareIntent,""));    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        if(requestCode == REQ_LOGIN) {            LineLoginResult result = LineLoginApi.getLoginResultFromIntent(data);            switch (result.getResponseCode()) {                case SUCCESS:                    // Login successful, 会有一个内部的toast,我们无需处理                    Log.e("slack", "LINE Login success  lineProfile: " + result.getLineProfile() + " line_credential: " + result.getLineCredential());                    break;                case CANCEL:                    // Login canceled by user                    Log.e("slack", "LINE Login Canceled by user!!");                    break;                default:                    // SERVER_ERROR     The login failed due to a server-side error.                    // NETWORK_ERROR    The login failed because the SDK could not connect to the LINE Platform.                    // INTERNAL_ERROR   The login failed due to an unknown error.                    Log.e("slack", "Login FAILED!" + result.getErrorData().toString());            }        }    }    private Uri obtainUri(boolean video, String filePath) {        Uri uri;        Cursor cursor;        if(video) {            uri = Uri.parse("content://media/external/video/media");            cursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null,                    null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);        } else {            uri = Uri.parse("content://media/external/images/media");            cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null,                    null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);        }        Uri imageUri = null;        cursor.moveToFirst();        while (!cursor.isAfterLast()) {            String data = cursor.getString(cursor                    .getColumnIndex(MediaStore.MediaColumns.DATA));            if (filePath.equals(data)) {                int ringtoneID = cursor.getInt(cursor                        .getColumnIndex(MediaStore.MediaColumns._ID));                imageUri = Uri.withAppendedPath(uri, ""                        + ringtoneID);                break;            }            cursor.moveToNext();        }        return imageUri;    }

Instagram 分享

  • instagram 官方地址,醉了醉了,第一步就踩坑,先让注册一个应用,都填写完了,验证码死活不对,我的Mac,用google,Safari,都是验证码不对,后来换了手机打开网页注册,验证码只需要填写一个对的单词就可以了,不要问我为什么,我也不清楚,感觉是这个验证码有问题

    这里写图片描述

  • 醉了,居然直接使用Intent分享,就是android自带的原生分享,早说呀,上面费了那么大劲,一点用都没有 Instagram官方666666666, 不过也有个好处,不需要新增任何sdk就可以分享到Instagram。

  • 下载了一个Intagram, 反编译了一下,拿到分享的包名,看到这一步,有没有很熟悉,就是他了, 支持图片和视频的分享

    <activity            android:theme="@ref/0x01030010"            android:name="com.instagram.share.common.ShareHandlerActivity"            android:exported="true"            android:taskAffinity="com.instagram.android.ShareHandlerActivity"            android:excludeFromRecents="true"            android:launchMode="3"            android:screenOrientation="1">            <intent-filter                android:label="@ref/0x7f0d0d63">                <action                    android:name="android.intent.action.SEND" />                <category                    android:name="android.intent.category.DEFAULT" />                <data                    android:mimeType="image/*" />                <data                    android:mimeType="video/*" />            </intent-filter>        </activity>

    这里写图片描述

    最后,附上测试的代码

    public class InstagramLoginActivity extends BaseOldActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.acitvity_third_instagram_login);}/** * 分享功能 *  ComponentName(String pkg, String cls) *  line的包名,line的接收资料的类名--》 </intent-filter> MainFist里面 */public void testShareImageClick(View view) {    ComponentName cn = new ComponentName("com.instagram.android"            , "com.instagram.share.common.ShareHandlerActivity");    Intent shareIntent = new Intent();    shareIntent.setAction(Intent.ACTION_SEND);    Uri uri = obtainUri(false,            new File(Environment.getExternalStorageDirectory(), "test.jpg").getAbsolutePath());    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);    shareIntent.setType("image/*"); //图片分享    shareIntent.setComponent(cn);//跳到指定APP的Activity    startActivity(Intent.createChooser(shareIntent,"Share to"));}/** * 同图片分享,不过是本地分享 */public void testShareVideoClick(View view) {    ComponentName cn = new ComponentName("com.instagram.android"            , "com.instagram.share.common.ShareHandlerActivity");    Intent shareIntent = new Intent();    shareIntent.setAction(Intent.ACTION_SEND);    Uri uri = obtainUri(true,            new File(Environment.getExternalStorageDirectory(), "test.mp4").getAbsolutePath());    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);    shareIntent.setType("video/*"); // video    shareIntent.setComponent(cn);//跳到指定APP的Activity    startActivity(Intent.createChooser(shareIntent,"Share to"));}private Uri obtainUri(boolean video, String filePath) {    Uri uri;    Cursor cursor;    if(video) {        uri = Uri.parse("content://media/external/video/media");        cursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null,                null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);    } else {        uri = Uri.parse("content://media/external/images/media");        cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null,                null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);    }    Uri imageUri = null;    cursor.moveToFirst();    while (!cursor.isAfterLast()) {        String data = cursor.getString(cursor                .getColumnIndex(MediaStore.MediaColumns.DATA));        if (filePath.equals(data)) {            int ringtoneID = cursor.getInt(cursor                    .getColumnIndex(MediaStore.MediaColumns._ID));            imageUri = Uri.withAppendedPath(uri, ""                    + ringtoneID);            break;        }        cursor.moveToNext();    }    return imageUri;}}