Android APP间授权登录(无需SDK类似微信登录)(源码+解析)

Android APP间授权登录(无需SDK类似微信登录)(源码+解析)

文章目录

  • Android APP间授权登录(无需SDK类似微信登录)(源码+解析)
    • 前言
    • 一 需求
    • 二 A应用(调用者)业务代码与布局
    • 三 B应用(授权应用)业务代码 (博主需求点也顺路写上,读者可不读下面123点)与布局代码
    • 四 结尾

前言

记录每天开发功能需求点以及踩坑点,方便以后查阅;如文章对读者,道友,有帮助,少踩点坑,少一点头疼,更是功德无量

一 需求


这两天做了一个需求,(类似微信等的授权登录)就是手头做的这个项目暂且称之为APP B提供给友商去拉起,提供授权登录的操作,授权成功后返回登录凭证token等信息给APP A处理

本文例子demo,希望对你开发有所帮助

  • 1,实现APP间相互调起(查看了相关技术资料,三种实现方式)
  • 2,拉起指定的授权页面(SignActivity)
  • 3,应用间数据相互传递

二 A应用(调用者)业务代码与布局

调用者A,MainActivity 页面代码
MainActivity简单一个发起授权按钮,下面是相关逻辑,博主面向不同读者做了统一适配,详细3步注释如下
1,注册按钮与事件,发起事件核心代码intent.setData(Uri.parse(mUri))
2,注册广播,核心代码 intentFilter.addAction(“kx.com.kx.b.sign”) ,action读者可自行定义
3,接收广播回调回来的参数,进行处理

public class MainActivity extends AppCompatActivity {

    private Button mBt;
    // com.kx.b 是B授权包名,如果读者Uri调起APP不熟悉,请查阅Uri拉起APP相关知识点,博主有时间的话,会在下篇补上相关知识点
    private String mUri = "kx://com.kx.b/sign?type=1&user_package_name=com.kx.b";
    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("", "");//这里Intent也可传递参数,但是一般情况下都会放到上面的URL中进行传递
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
        });

		//操作2 
		//注册广播接受者,接收授权成功返回广播信息
        mReceiver = new MyBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        //kx.com.kx.b.sign 自行定义action 即可
        intentFilter.addAction("kx.com.kx.b.sign");
        registerReceiver(mReceiver, intentFilter);
    }


	//操作3 
	//BroadcastReceiver 接收授权成功返回广播信息,TODO
    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);
    }
}

MainActivity 对应的activity_main.xml布局




    

A应用注册AndroidManifest.xml清单添加权限

    
    

三 B应用(授权应用)业务代码 (博主需求点也顺路写上,读者可不读下面123点)与布局代码

B(授权应用),SignActivity 页面代码
1,SignActivity打开前,先处理A应用数据,传递给服务器校验是否授权
2,服务器给予授权,则是上面gif看到正常页面,点击按钮授权即可
3,B应用未登录先走登录页面,登录后再进入上面授权页面
4, 按钮授权 核心代码intent1.setAction(“kx.com.kx.b.sign”) ,sendBroadcast(intent1);

public class SignActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mBt;
    private String mUser_package_name;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign);

        mBt = findViewById(R.id.bt_confirm_login);
        mBt.setOnClickListener(this);
        mBt.setEnabled(false);

        //获取传递的数据
        Intent intent = getIntent();
        Uri uri = intent.getData();

        //获取参数值
        String type = uri.getQueryParameter("type");
        mUser_package_name = uri.getQueryParameter("user_package_name");

        //类型type 检验
        if (TextUtils.equals(type, "1")) {
            //Todo 未登录 处理
            request5037();
        }
    }

    /**
     * 外部 app 拉起授权 (code:5037)
     * 服务器校验 是否授权
     * 授权 页面A状态
     */

    private void request5037() {
        mBt.setEnabled(true);
    }


    @Override
    public void onClick(View v) {
        Intent intent1 = new Intent();
        intent1.setAction("kx.com.kx.bapp.sign");
        intent1.putExtra("token", "xxxx-xxxx-xxxxx");
        intent1.putExtra("app_pkg", "com.kx.aapp");
        sendBroadcast(intent1);
        finish();
    }
}

SignActivity 对应的布局代码activity_sign.xml





    

    

    

    

    

    

        

        

    

    

        

        


    


    

B应用在清单文件AndroidManifest.xml 需要配置

        
        
            
                
                
            
            
                
                
                
            
        

四 结尾

demo(包含2个APP,A申请授权,B授权应用)下载地址:

https://download.csdn.net/download/qxing123456789/10778914

如有写的不好,欢迎提出bug或者不足,衷心感谢,联系个人邮箱[email protected]

###脚注
多说一嘴:1.


  1. 多说一嘴:各位看文的兄弟姐妹多多锻炼身体,愿大家身体健康. ↩︎

你可能感兴趣的:(Android,工作需求功能归档)