老套路上图:
说下实现思路:
首先我们Android自带的隐式跳转打开三方APP,与此同时注册一个广播用于接收三方APP传递过来的token信息用于登录自己的APP。也就是说拿到三方APP的登录token然后使用三方APP传过来的token进行登录即可。
看代码:
打开三方APP以及注册广播和接收广播数据的页面Mainactivity.java
package com.xiayiye5.authority;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private Button mBt;
/**
* cn.net.gfan.world 被调起应用包名 type为类型 1 授权登陆 user_package_name:使用者包名
*/
private String mUri = "yhsh://cn.net.gfan.world/sign?type=1&user_package_name=com.xiayiye5.authority";
private MyBroadcastReceiver mReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//操作1 按钮发起
mBt = findViewById(R.id.bt);
mBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setData(Uri.parse(mUri));//参数拼接在URI后面 type=1是授权页面,user_package_name使用者包名,后续参数可自行添加
intent.putExtra("xiayiye5", "下一页5");//这里Intent也可传递参数,但是一般情况下都会放到上面的URL中进行传递
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
//操作2
//注册广播接受者,接收授权成功返回广播信息
mReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
//yhsh.com.yhsh.b.sign 自行定义action 即可,定义为被唤起的app包名
intentFilter.addAction("yhsh.cn.net.gfan.world.sign");
registerReceiver(mReceiver, intentFilter);
}
/**
* 操作3
* BroadcastReceiver 接收授权成功返回广播信息
*/
private class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 授权成功 返回token,app_pkg
Toast.makeText(MainActivity.this, "授权成功!", Toast.LENGTH_SHORT).show();
final String token = intent.getStringExtra("token");
final String app_pkg = intent.getStringExtra("app_pkg");
mBt.setText("token=" + token + "\n" + "app_pkg=" + app_pkg);
//todo 调起方登录操作 做你需要的需求
}
}
/**
* 别忘了回收广播 不然会报error,这里是一个内存回收的知识点,第二个有时间博主会补上的知识点
*/
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
}
再看下三方APP里面怎么做的?PermissionActivity.java
package cn.net.gfan.world;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
/**
* @author xiayiye5
* 2020年6月8日09:23:17
*/
public class PermissionActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
Button btConfirmLogin = findViewById(R.id.bt_confirm_login);
btConfirmLogin.setOnClickListener(this);
getData();
}
/**
* 获取SDK传递过来的参数
*/
private void getData() {
//获取传递的数据
Intent intent = getIntent();
Uri uri = intent.getData();
//获取参数值
String type = uri.getQueryParameter("type");
String userPackageName = uri.getQueryParameter("user_package_name");
}
@Override
public void onClick(View v) {
//授权登录发送广播传递参数关闭当前APP
Intent intent1 = new Intent();
//此处为被唤起的app包名也可以自定义action但是必须得跟要接受广播的APP的action一致
intent1.setAction("yhsh.cn.net.gfan.world.sign");
intent1.putExtra("token", "dhuhguidhue-3029r3092");
intent1.putExtra("app_pkg", "com.vistateach.homework");
sendBroadcast(intent1);
finish();
}
}
看下清单文件的配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.net.gfan.world">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".PermissionActivity"
android:launchMode="singleInstance">
<intent-filter>
<data
android:host="cn.net.gfan.world"
android:path="/sign"
android:scheme="yhsh" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
红框里面的参数必须配置完整
代码看起来麻烦也可以下载源码:源码下载
如果没有积分可以从GitHub地址下载:GitHub直达下载
再次非常感谢原博主提供的思路:本人结合需求进行了部分修改: