ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android高仿网易云音乐-启动界面实现和动态权限处理

2022-07-03 16:36:50  阅读:232  来源: 互联网

标签:EXTERNAL 界面 permission void Manifest 高仿 Android 权限 LOCATION


效果

实现分析

基本上没有什么难点,就是布局,然后显示用户协议对话框,动态处理权限,判断是否显示引导界面,是否显示广告界面等。

布局

<?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-->
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="120dp"
        android:src="@drawable/splash_banner" />

    <!--logo-->
    <ImageView
        android: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" />

    <!--版权-->
    <TextView
        android: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>

是否显示用户协议对话框

if (DefaultPreferenceUtil.getInstance(getHostActivity()).isAcceptTermsServiceAgreement()) {
    //已经同意了用户协议

    checkPermission();
} else {
    showTermsServiceAgreementDialog();
}

动态处理权限

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

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);
}

界面跳转

private void postNext() {
    binding.copyright.postDelayed(new Runnable() {
        @Override
        public 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);
}

标签:EXTERNAL,界面,permission,void,Manifest,高仿,Android,权限,LOCATION
来源: https://www.cnblogs.com/woblog/p/16440026.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有