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(); 不依赖于是否安装了客户端,在应用打开一个新分享界面
- TweetComposer.Builder
推特的分享结果是已广播的形式回调的
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;}}
- Android之海外第三方登录
- Android之微信第三方登录
- Android之第三方登录分享封装
- Android 第三方登录
- Android 第三方登录
- Android第三方登录
- android 第三方登录
- Android 第三方登录
- Android应用接入第三方登录之新浪登录
- android第三方登录之微信登录详情
- android第三方登录之腾讯QQ登录
- android 友盟第三方登录之微信登录
- 第三方登录之QQ
- 第三方登录之QQ
- 第三方之QQ登录
- Android QQ第三方登录
- android,QQ第三方登录
- Android第三方账号登录
- 栅格数据
- CMake之CMakeLists.txt编写学习
- 物理地址、虚拟地址及逻辑地址
- 黑科技 heap 学习一个
- 【二分+hash】【manacher】【gfoj】Problem 852: antisymmetry
- Android之海外第三方登录
- 注解学习笔记
- react-native 集成极光推送
- Ubuntu16.04下安装redis
- MongoDB和Redis区别
- 黑科技 heap 学习一个
- disconf安装与使用
- WEB版一次选择多个文件进行批量上传(Plupload)的解决方案
- HDU3491最小割拆点