Android之海外第三方登录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/I_do_can/article/details/78112104

本文主要记录海外应用第三方登录: 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 {
    
    @Override
    protected 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;
    }
    }
    

猜你喜欢

转载自blog.csdn.net/I_do_can/article/details/78112104