0.效果


效果图依次为启动界面,第一次显示用户协议对话框,动态获取权限。

系列文章目录导航

目录

1.实现分析

启动基本上没有什么难点,但在真实项目逻辑还是比较多;就是布局,然后显示用户协议对话框,动态处理权限,判断是否显示引导界面,是否显示广告界面等。

2.界面布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"tools:context=".component.splash.activity.SplashActivity"><!--banner--><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_marginTop="120dp"android:src="@drawable/splash_banner" /><!--logo--><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/copyright"android:layout_centerHorizontal="true"android:layout_marginBottom="20dp"android:src="@drawable/splash_logo" /><!--版权--><TextViewandroid:id="@+id/copyright"android:textColor="@color/black80"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="30dp"android:text="@string/copyright" />
</RelativeLayout>

3.是否显示用户协议对话框

if (DefaultPreferenceUtil.getInstance(getHostActivity()).isAcceptTermsServiceAgreement()) {//已经同意了用户协议checkPermission();
} else {showTermsServiceAgreementDialog();
}

4.自定义协议对话框

继承自DialogFragment自定义对话框。

/*** 服务条款和隐私协议对话框*/
public class TermServiceDialogFragment extends BaseViewModelDialogFragment<FragmentDialogTermServiceBinding> {private static final String TAG = "TermServiceDialogFragment";private View.OnClickListener onAgreementClickListener;public static TermServiceDialogFragment newInstance() {Bundle args = new Bundle();TermServiceDialogFragment fragment = new TermServiceDialogFragment();fragment.setArguments(args);return fragment;}/*** 显示对话框** @param fragmentManager* @param onAgreementClickListener 同意按钮点击回调*/public static void show(FragmentManager fragmentManager, View.OnClickListener onAgreementClickListener) {//创建fragmentTermServiceDialogFragment fragment = newInstance();fragment.onAgreementClickListener = onAgreementClickListener;//显示//TAG只是用来查找Fragment的//我们这里不需要查找//所以值可以随便写fragment.show(fragmentManager, "TermServiceDialogFragment");}@Overrideprotected void initViews() {super.initViews();//点击弹窗外边不能关闭setCancelable(false);SuperTextUtil.setLinkColor(binding.content, getActivity().getColor(R.color.link));}@Overrideprotected void initDatum() {super.initDatum();Spanned content = Html.fromHtml(getString(R.string.term_service_privacy_content));//lambda写法,监听器里面只有一个方法才能这样写SpannableStringBuilder result = SuperTextUtil.setHtmlLinkClick(content, data -> Log.d(TAG, "onLinkClick: " + data));binding.content.setText(result);}@Overrideprotected void initListeners() {super.initListeners();binding.primary.setOnClickListener(view -> {dismiss();onAgreementClickListener.onClick(view);});binding.disagree.setOnClickListener(view -> {dismiss();SuperProcessUtil.killApp();});}
}

5.动态处理权限

现在做Android必须要动态处理权限,这里使用第三方框架,推荐再用到的时候才动态请求权限,写法和现在一样。

5.1添加动态权限框架

动态处理权限可以直接使用系统API,添加第三方框架目的是使用更加方便。

//动态处理权限
//https://github.com/permissions-dispatcher/PermissionsDispatcher
implementation "com.github.permissions-dispatcher:permissionsdispatcher:4.8.0"
annotationProcessor "com.github.permissions-dispatcher:permissionsdispatcher-processor:4.8.0"

5.2实现

private void checkPermission() {//让动态框架检查是否授权了//如果不使用框架就使用系统提供的API检查//它内部也是使用系统API检查//只是使用框架就更简单了SplashActivityPermissionsDispatcher.onPermissionGrantedWithPermissionCheck(this);
}/*** 权限授权了就会调用该方法* 请求相机权限目的是扫描二维码,拍照*/
@NeedsPermission({Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION
})
void onPermissionGranted() {//如果有权限就进入下一步prepareNext();
}/*** 显示权限授权对话框* 目的是提示用户*/
@OnShowRationale({Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION
})
void showRequestPermission(PermissionRequest request) {new AlertDialog.Builder(getHostActivity()).setMessage(R.string.permission_hint).setPositiveButton(R.string.allow, (dialog, which) -> request.proceed()).setNegativeButton(R.string.deny, (dialog, which) -> request.cancel()).show();
}/*** 拒绝了权限调用*/
@OnPermissionDenied({Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION
})
void showDenied() {//退出应用finish();
}/*** 再次获取权限的提示*/
@OnNeverAskAgain({Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION
})
void showNeverAsk() {//继续请求权限checkPermission();
}/*** 授权后回调** @param requestCode* @param permissions* @param grantResults*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);//将授权结果传递到框架SplashActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}

6.界面跳转

private void postNext() {binding.copyright.postDelayed(new Runnable() {@Overridepublic void run() {next();}}, Config.SPLASH_DEFAULT_DELAY_TIME);}private void next() {//获取意图的目的是,因为启动该界面的时候,可能携带一些数据//需要在主界面处理Intent intent = new Intent();Intent oldIntent = getIntent();IntentUtil.cloneIntent(oldIntent, intent);//if (sp.isLogin()) {//intent.setClass(getHostActivity(), AdActivity.class);//} else {intent.setClass(getHostActivity(), MainActivity.class);//}startActivity(intent);//关闭当前界面finish();//禁用启动动画overridePendingTransition(0, 0);
}

7.总结

到这里启动界面相关逻辑就实现完成了,总体来说还是比较简单的。

1.Android高仿网易云音乐-启动界面实现和动态权限处理相关推荐

  1. Android项目实战之高仿网易云音乐启动界面

    这一节我们来讲解启动界面,效果如下: 首次创建一个SplashActivity用来做启动界面,因为创建完项目默认是MainActivity做主界面,所以需要去掉,将启动配置到同时去掉SplashAct ...

  2. Android高仿网易云音乐播放界面

    现在很多的播放器的播放界面都是采用光盘的转动,下面是我仿造网易的播放界面.先上两张图: 第一张为播放前的界面,第二张为点击播放按钮的图片.布局文件如下: <RelativeLayout xmln ...

  3. 2.Android高仿网易云音乐-引导界面和广告界面实现

    效果图 效果图依次为图片广告,视频广告,引导界面. 系列文章目录导航 目录 1.实现分析 广告界面就是显示图片和视频,所以可以放一个图片控件,视频控件,然后跳过按钮,提示按钮,WiFi预加载提示都是放 ...

  4. Android高仿网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM

    简介 这是一个使用Java(以后还会推出Kotlin版本)语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),包含了基础内容,高级内容,项目封装,项目重构等知识:主要是使用系统功能, ...

  5. 3.Android高仿网易云音乐-首页复杂发现界面布局和功能

    0.效果图 效果图依次为发现界面顶部,包含首页轮播图,水平滚动的按钮,推荐歌单:然后是发现界面推荐单曲,点击单曲就是直接进入播放界面:最后是全局播放控制条上点击播放列表按钮显示的播放列表弹窗. 1.整 ...

  6. android 仿网易标签切换,高仿网易云音乐客户端的Home页面切换Tabhost-IT蓝豹

    1.高仿网易云音乐客户端的Home页面切换Tabhost 高仿网易云音乐客户端的Home页面切换Tabhost,并且三角形是透明的, 实现方式,自定义AnimTabsView继承 RelativeLa ...

  7. Flutter+FishRedux高仿网易云音乐

    flutter_netease_cloud_music 采用FishRedux框架与开源网易云音乐api开发的高仿网易云音乐APP,技术栈主要是:Flutter+FishRedux,目前主要是偏重AP ...

  8. 新鲜出炉高仿网易云音乐 APP

    我的引语 晚上好,我是吴小龙同学,我的公众号「菜鸟翻身」会推荐 GitHub 上好玩的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注我. 项目中成长是最快的,如何成长,就是解决问题 ...

  9. Vue3.0 + typescript 高仿网易云音乐 WebApp

    Vue3.0 + typescript 高仿网易云音乐 WebApp 前言 Vue3.0 的正式发布,让我心动不已,于是尝试用 vue3 实现一个完整的项目,整个项目全部使用了 composition ...

最新文章

  1. android PhotoView的用法
  2. Oracle 存储过程 无法编译 解决方法(转载)
  3. Linux学习日记——源码编译Apache
  4. HTML图片元素(标记)
  5. Ubuntu下Authentication token manipulation error或者Authentication Failure解决办法
  6. 3场直播丨达梦DM8数据库安装部署初体验、新基建下的国产数据库应用和发展趋势、Oracle外部表创建与使用...
  7. springboot-21-maven多环境打包
  8. 目标检测——Detectron2的学习笔记
  9. Linux调试分析诊断利器——strace
  10. Mac新手必备技巧-如何使用 macOS 帮助菜单?
  11. python实现多个excel文件两种方式合并:多表单形式合并、单表单(增加标识列来区分不同文件)形式合并
  12. DataTable转成字符串复制到txt文本
  13. Altium Designer 17 安装破解版详细教程
  14. VB实际读写INI文件
  15. C语言实现的简易FTP客户端
  16. 18、弱电锦集:网络视频监控知识问答100例
  17. ets交易软件测试简历,ETS工具使用指南
  18. 双11到了,月薪5千的人如何赚到2万?这里有5个技巧!
  19. ubuntu18.04安装显卡驱动,Anaconda,CUDA,pytorch全套流程
  20. 第一篇 厚黑学 二、厚黑学

热门文章

  1. 地球绕着太阳转 月球绕着地球转(入门)
  2. 基于php054个人财务管理系统
  3. 苹果开发者_国外苹果企业开发者账户
  4. RTKlib相对定位源码解析:zdres函数
  5. 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构2 Keepalived
  6. 易康(ESP2插件)运行时出现的问题解决办法
  7. ARM的Nand Flash入门使用手册(以K9F2G08X0M为例)
  8. linux应用程序设置粘滞位,Linux粘滞位的设置
  9. VMware 15安装Windows10教程
  10. Python中集合set的使用详解