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


    效果

    实现分析

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

    布局

    <?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);
    }
    
    折叠
  • 相关阅读:
    SpringBoot项目@Async默认线程池导致OOM问题?
    Pytorch中的torch.index_select对应MindSpore哪个方法
    代码随想录二刷day34
    Android 小组件 AppWidgetProvider
    面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
    Python正则表达式完全指南
    DOM及DOM相关操作
    JMeter websocket接口测试
    Vue+Element-ui+SpringBoot搭建后端汽车租赁管理系统
    OpenV2X:OpenInfra延伸到Open Vertical Infra的尝试和探索
  • 原文地址:https://www.cnblogs.com/woblog/p/16440026.html