Android开发之高仿三方授权登录的实现方案类似微信登录QQ登录微博登录人人网登录

老套路上图:

说下实现思路:

首先我们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直达下载

再次非常感谢原博主提供的思路:本人结合需求进行了部分修改:

授权登录博主

猜你喜欢

转载自blog.csdn.net/xiayiye5/article/details/106613479