1.Android高仿网易云音乐-启动界面实现和动态权限处理
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高仿网易云音乐-启动界面实现和动态权限处理相关推荐
- Android项目实战之高仿网易云音乐启动界面
这一节我们来讲解启动界面,效果如下: 首次创建一个SplashActivity用来做启动界面,因为创建完项目默认是MainActivity做主界面,所以需要去掉,将启动配置到同时去掉SplashAct ...
- Android高仿网易云音乐播放界面
现在很多的播放器的播放界面都是采用光盘的转动,下面是我仿造网易的播放界面.先上两张图: 第一张为播放前的界面,第二张为点击播放按钮的图片.布局文件如下: <RelativeLayout xmln ...
- 2.Android高仿网易云音乐-引导界面和广告界面实现
效果图 效果图依次为图片广告,视频广告,引导界面. 系列文章目录导航 目录 1.实现分析 广告界面就是显示图片和视频,所以可以放一个图片控件,视频控件,然后跳过按钮,提示按钮,WiFi预加载提示都是放 ...
- Android高仿网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM
简介 这是一个使用Java(以后还会推出Kotlin版本)语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),包含了基础内容,高级内容,项目封装,项目重构等知识:主要是使用系统功能, ...
- 3.Android高仿网易云音乐-首页复杂发现界面布局和功能
0.效果图 效果图依次为发现界面顶部,包含首页轮播图,水平滚动的按钮,推荐歌单:然后是发现界面推荐单曲,点击单曲就是直接进入播放界面:最后是全局播放控制条上点击播放列表按钮显示的播放列表弹窗. 1.整 ...
- android 仿网易标签切换,高仿网易云音乐客户端的Home页面切换Tabhost-IT蓝豹
1.高仿网易云音乐客户端的Home页面切换Tabhost 高仿网易云音乐客户端的Home页面切换Tabhost,并且三角形是透明的, 实现方式,自定义AnimTabsView继承 RelativeLa ...
- Flutter+FishRedux高仿网易云音乐
flutter_netease_cloud_music 采用FishRedux框架与开源网易云音乐api开发的高仿网易云音乐APP,技术栈主要是:Flutter+FishRedux,目前主要是偏重AP ...
- 新鲜出炉高仿网易云音乐 APP
我的引语 晚上好,我是吴小龙同学,我的公众号「菜鸟翻身」会推荐 GitHub 上好玩的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注我. 项目中成长是最快的,如何成长,就是解决问题 ...
- Vue3.0 + typescript 高仿网易云音乐 WebApp
Vue3.0 + typescript 高仿网易云音乐 WebApp 前言 Vue3.0 的正式发布,让我心动不已,于是尝试用 vue3 实现一个完整的项目,整个项目全部使用了 composition ...
最新文章
- android PhotoView的用法
- Oracle 存储过程 无法编译 解决方法(转载)
- Linux学习日记——源码编译Apache
- HTML图片元素(标记)
- Ubuntu下Authentication token manipulation error或者Authentication Failure解决办法
- 3场直播丨达梦DM8数据库安装部署初体验、新基建下的国产数据库应用和发展趋势、Oracle外部表创建与使用...
- springboot-21-maven多环境打包
- 目标检测——Detectron2的学习笔记
- Linux调试分析诊断利器——strace
- Mac新手必备技巧-如何使用 macOS 帮助菜单?
- python实现多个excel文件两种方式合并:多表单形式合并、单表单(增加标识列来区分不同文件)形式合并
- DataTable转成字符串复制到txt文本
- Altium Designer 17 安装破解版详细教程
- VB实际读写INI文件
- C语言实现的简易FTP客户端
- 18、弱电锦集:网络视频监控知识问答100例
- ets交易软件测试简历,ETS工具使用指南
- 双11到了,月薪5千的人如何赚到2万?这里有5个技巧!
- ubuntu18.04安装显卡驱动,Anaconda,CUDA,pytorch全套流程
- 第一篇 厚黑学 二、厚黑学