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

2023-05-16

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

实例gif

文章目录

  • 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布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/bt"
        android:text="APP授权登陆"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>

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

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

三 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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">


    <View
        android:layout_width="match_parent"
        android:layout_height="2px"
        android:layout_gravity="center_horizontal"
        android:background="@color/color_eeeeee"/>

    <ImageView
        android:id="@+id/img_head"
        android:layout_width="85dp"
        android:layout_height="85dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="60dp"
        android:background="@mipmap/ic_launcher"/>

    <TextView
        android:id="@+id/tv_app_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="30dp"
        android:layout_marginTop="10dp"
        android:textSize="18sp"
        android:text="B应用"
        android:textColor="@color/color_333333"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="2px"
        android:layout_gravity="center_horizontal"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:background="@color/color_eeeeee"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="15dp"
        android:text="登录后应用将获取一下权限"
        android:textColor="@color/color_333333"
        android:textSize="14sp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="15dp"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="7dp"
            android:layout_height="7dp"
            android:layout_gravity="center_vertical"
            android:background="@drawable/shape10_bg_bfbfbf"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:text="获取的公开信息(昵称、头像等)"
            android:textColor="@color/color_bfbfbf"
            android:textSize="11sp"/>

    </LinearLayout>

    <LinearLayout
        android:id="@+id/ll_success_show"
        android:visibility="gone"
        android:gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="15dp"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/img_use_head"
            android:layout_width="28dp"
            android:layout_height="28dp"
            />

        <TextView
            android:layout_marginLeft="10dp"
            android:textSize="14sp"
            android:textColor="@color/color_333333"
            android:id="@+id/tv_use_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>


    </LinearLayout>


    <Button
        android:id="@+id/bt_confirm_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="15dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="30dp"
        android:padding="6dp"
        android:text="@string/comfirm_login"
        android:textColor="@color/white"
        android:textSize="20sp"/>

</LinearLayout>

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

        <!--授权页面-->
        <activity android:name=".SignActivity"
                  android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.DELETE"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <data
                    android:host="com.kx.bapp"
                    android:path="/sign"
                    android:scheme="kx"/>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

四 结尾

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

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

如有写的不好,欢迎提出bug或者不足,衷心感谢,联系个人邮箱593584960@qq.com

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Qt——日志输出

    普通的打印输出 用 QtCreator 开发 Qt 程序时 xff0c 经常需要向控制台打印一些参数 有时候是查看对象的属性是否被正确设置 xff0c 有时候是查看程序是否执行了某一段代码 xff0c 或者执行了多少次这一段代码 尽管使用调
  • 消息队列的重要技术讲解

    一 什么是消息队列 xff1f 消息队列不知道大家看到这个词的时候 xff0c 会不会觉得它是一个比较高端的技术 xff0c 反正我是觉得它好像是挺牛逼的 消息队列 xff0c 一般我们会简称它为MQ Message Queue xff0c
  • [android nfc] onNewIntent 中 无法获取 tag, 或者 intent.extras 为空, 或者 intent.action 为空

    在做android nfc 场景的时候 大方向上有2种 foreground 调度系统enableReaderMode api foreground 调度系统 发现android12下无法获取tag信息 经过排查 原因如下 在 androi
  • linux系统常用命令列举

    Linux系统入门 Linux特点 开源多用户 xff1a 系统可以在保证各个用户之间的安全 xff0c 隐私多任务 xff1a 良好的界面 xff1a Linux同时支持两种环境 xff0c 字符界面 图形化界面支持多种平台 xff1a
  • linux 常用命令

    查看所有分区 du sh window 想查看进程的端口号有这样几个方法 1 使用netstat ano查看所有连接和监听端口 xff0c 以及每个连接相关的进程ID 2 使用进程管理器查看进程PID 默认情况下可能不显示PID xff0c
  • android 11 Setting panel的一次源码分析

    Android 11 Setting panel的一次源码分析 Android 11关于Wi Fi的开关等设置 xff0c 不允许用户直接调用 xff0c 需要从panel设置 启动代码如下 xff1a val panelIntent 61
  • nginx与ftp服务器出现403错误

    默认的yum安装 ftp的路径是在 etc vsftpd xff0c 这时候通过上面创建的 用户从 FTP登陆后 进入 home目录就可以查看到ftpuser文件夹 上图这里有个小细节就是在Linux中 xff0c 创建一个文件时 xff0
  • 高通Android平台硬件调试之Camera篇

    之前一段时间有幸在高通android平台上调试2款camera sensor xff0c 一款是OV的5M YUV sensor xff0c 支持jpeg out xff0c 同时也支持AF xff0c 调试比较比较简单 xff0c 因为别
  • 7 计算机组成原理第五章 中央处理器 数据通路

    文章目录 1 数据通路的功能和基本结构单总线1 1 数据通路的功能1 2 数据通路 基本结构单总线 2 数据通路 CPU内部单总线方式2 1 三种结构之间数据传送方式2 2 CPU内部单总线方式 例题 3 专用通路3 1 专用数据通路方式3
  • Python 记录日志简单好用,功能齐全(Loguru)

    Loguru 一个能彻底解放你的日志记录器 它即插即用 xff0c 具备多种方式滚动日志 自动压缩日志文件 定时删除等功能 除此之外 xff0c 多线程安全 高亮日志 日志告警等功能也不在话下 下面就给大家介绍一下这个强大工具的基本使用方法
  • linux设备驱动——andriod平台wlan驱动II——给军爷的答案

    转自 http wsqhs spaces live com c11 BlogPart BlogPart 61 blogview amp c 61 BlogPart amp partqs 61 amonth 3d4 26ayear 3d200
  • Linux 下 如何打 PATCH 及制作 DIFF

    Linux下patch的制作和应用 因为在u boot移植过程中 xff0c 有几处通用文件要修改 xff0c 如果每次都要手动修改就太麻烦了 制作补丁可以解决这个问题 学习资料的收集比较简单 xff0c 方法一类似于这种初级问题网上资料非
  • LINUX GIT 使用

    git show HEAD git show HEAD git show HEAD git show HEAD git diff 486ec madplay player c git diff 4863 856f git diff 4863
  • LINUX 输入子系统分析

    1 输入子系统架构Overview 输入子系统 xff08 Input Subsystem xff09 的架构如下图所示 输入子系统由 输入子系统核心层 xff08 Input Core xff09 xff0c 驱动层和事件处理层 xff0
  • Linux Kernel and Android 休眠与唤醒

    Table of Contents 简介 国际化 版本信息 对于休眠 suspend 的简单介绍 Linux Suspend 的流程 相关的文件 准备 冻结进程 让外设进入休眠 Resume Android 休眠 suspend 涉及到的文
  • 浅析linux下键盘设备工作和注册流程

    span style color 000000 a href http qgjie456 blog 163 com blog m 61 0 span style font size 6 http qgjie456 blog 163 com
  • linux内核信号处理

    信号是操作系统中一种很重要的通信方式 近几个版本中 信号处理这部份很少有大的变动 我们从用户空间的信号应用来分析Linux内核的信号实现方式 一 信号有关的数据结构 在task struct中有关的信号结构 struct task stru
  • win7和ubuntu双系统,直接进入windows启动项选择菜单,而不进入grub的解决方案。

    一 Ubuntu 采用 grub 引导 xff0c 首先要将 grub 引导去掉 xff0c 重建 windows mbr 引导 xff0c 下载 MbrFix exe 并将它放到 C 盘根目录 xff08 其他目录也可 xff09 xff
  • 带你搞明白Zookeeper选举机制

    没什么 xff0c 搞不明白别打我就行 xff0c 初学者如有问题请及时指正 xff01 在上一篇文章我们有介绍3种server角色 xff1a Leader Follower以及Observer xff08 不参加选举 xff09 xff
  • windows远程linux桌面

    TigerVNC是一个高性能 平台无关的虚拟网络计算 xff08 Virtual Network Computing xff0c VNC xff09 实现 xff0c 是一个客户端 服务器应用程序 xff0c 允许用户在远程机器上启动并与图

随机推荐

  • 循环队列的介绍与实现

    文章目录 1 循环队列定义2 循环队列基本操作3 循环队列代码实现4 补充 1 循环队列定义 循环队列 xff1a 即顺序存储的队列 xff0c 是为了避免 假溢出 而利用 运算符将队列首尾相接连成一个环状的队列 xff0c 称为循环队列
  • AndroidStudio4.1 升级Kotlin插件不生效问题

    背景 xff0c 在使用SAM转换写Livedata observe 的第二个参数时 xff0c 发现AS报红 xff0c 但编译不出错 xff0c 功能也能正常运行 然后就尝试升级Kotlin插件 AndroidStudio4 1 默认带
  • 一个中科大差生的8年程序员工作总结

    今年终于从大菊花厂离职了 xff0c 离职前收入大概60w不到吧 xff0c 在某乎属于比较差的 xff0c 今天终于有空写一下自己的职场故事 xff0c 也算是给自己近8年的程序员工作做个总结复盘 近8年有些事情做对了 xff0c 也有更
  • 如何一步一步成为一个领域专家

    经常有人问我 xff0c 为什么有的人工作10年仍然平台无奇 xff0c 而有的人只用3年时间 xff0c 就已经脱颖而出 xff0c 成绩斐然 我说 xff0c 是呀 xff0c 有些参加工作多年却仍然只会复制粘贴简单业务代码 xff0c
  • 如何一步一步建立自己的技术影响力

    很多朋友是不是有这样的经历 xff0c 当我们还是一个菜鸟的时候 xff0c 团队里总有1 2个技术大拿 xff0c 每当有技术问题大家争论不休 xff0c 团队成员讨论的面红耳赤 xff0c 技术大牛实在看不下去 xff0c 掐灭手中的烟
  • 一个老程序员的一些职场经验分享

    有一些关于职场的经验 xff0c 当然有一些是以前总结过的 xff0c 现在归类总结一下 xff0c 上半部分是通用职场 xff0c 下半部分是程序员专用 一 通用职场经验 1 xff09 很多人认为事情做得多 xff0c 事情做得好就能晋
  • 第2章 第一个Spring Boot项目

    开发工具选择 工欲善其事必先利其器 xff0c 我们进行Java项目开发 xff0c 选择一个好的集成开发工具 xff08 IDE xff09 对提高我们的开发调试效率有非常大的帮助 这里我们选择大名鼎鼎的IDEA xff0c 它全称 In
  • 第8章 使用注解的方式整合MyBatis 入门详解

    目录 注解方式和配置文件方式的优缺点 使用注解方式整合MyBatis 添加依赖 配置application properties文件 在启动类上添加apperScan注解 创建mapper接口和实体类目录 添加实体类 测试验证 添加参数 直
  • 第9章 Spring Boot整合JPA 与 JpaRepository 基础方法介绍

    参考文章 xff1a 第1章 Spring Boot到底是什么 xff1f 陈小房的博客 CSDN博客 第2章 第一个Spring Boot项目 陈小房的博客 CSDN博客 第3章 Spring Boot项目配置详解 陈小房的博客 CSDN
  • 新手程序员快速升职项目经理(程序员小故事1)

    xff08 刚编的小故事 xff0c 希望对新入门的程序员有所帮助 xff09 英雄 无用武之地 小谢今年从XX大学计算机专业毕业 xff0c 和很多大学生不一样 xff0c 小谢在学校没有将时间用于开黑玩游戏 谈恋爱 xff0c 而是将时
  • Windows鼠标右键添加cmd

    1 win 43 R 打开windows运行 2 在文本框输入regedit 搜索 3 在HKEY CLASSES ROOT当中找到Folder 4 在Folder中找到shell 5 右键shell新建项cmdPrompt 6 点击cmd
  • MIPS指令与MIPS汇编语言

    文章目录 1 MIPS简介2 MIPS指令系统的特点3 MIPS寄存器4 MIPS指令格式4 1 R Type型指令4 2 l Type型指令4 3 J Type型指令4 4 三类指令小结 5 MIPS例题6 MIPS过程调用6 1 过程调
  • 一加7Pro(oneplus 7Pro)和一加三安装kali nethunter

    准备条件 xff1a 一台一加7Pro手机谷歌的adb和fastboot工具集 工具包名称 xff1a platform tools氧OS线刷包 10 3 0版本 twrp 非官方版本magiskDisable Dm Verity Forc
  • 如何解除Chrome无法安装第三方插件的限制(无法从该网站加载扩展程序和用户脚本)

    2018年6月谷歌宣布将废除 Chrome 扩展的内联安装方式 xff08 inline installation xff09 所以说 xff0c 自Chrome 67版本开始 xff0c 谷歌调整Chrome的插件安装策略 xff0c 只
  • 【STM32】HAL库——定时器溢出中断

    经过多次调试 xff0c 我发现Proteus 8的仿真效果并不是很理想 xff0c 所以接下来的例程将改用STM32F103RCT6单片机实物进行讲解 前期准备 xff1a STM32CubeMXSTM32RCT6核心板IDE Keil
  • 【Hexo】GitHub_Page绑定阿里云域名

    前言 对于使用GitHub Pages的小伙伴来说 xff0c GitHub自带的xxx github io网址 xff0c 很容易被挡掉 xff0c 就像这样 我猜大概率是因为这种网址没有证书 没备案之类的 xff0c 导致浏览器检测不安
  • No cached version of com.android.tools.build:aapt2:3.3.2-5309881 available for offline mode.

    No cached version of com android tools build aapt2 3 3 2 5309881 available for offline mode 处理 xff1a gradlew assemble 清理
  • Android H5 webView加载过程黑屏优化处理

    Android H5 webView加载过程黑屏优化处理 一 问题 H5内嵌页面时 xff0c 用webView加载过程中出现黑屏 xff1a 优化处理 xff0c 在setWebViewClient的onPageStarted和onPag
  • 【无标题】

    Android ADB相关使用 Android ADB相关使用 获取手机安卓系统版本 xff1a adb shell getprop ro build version release获取手机SDK版本 xff1a shell getprop
  • Android APP间授权登录(无需SDK类似微信登录)(源码+解析)

    Android APP间授权登录 无需SDK类似微信登录 源码 43 解析 文章目录 Android APP间授权登录 无需SDK类似微信登录 源码 43 解析 前言一 需求二 A应用 调用者 业务代码与布局三 B应用 授权应用 业务代码