安卓开发常用的方法 作者:pandali 时间:2022年03月16日 分类:计算机技术,Android 字数:9462 安卓开发时会用到好多方法,但是经常会忘急,所以专门写一篇博客来记录常用的方法 #### 隐藏状态栏(亲测第二个有用) ``` # 隐藏当前activity的状态栏。 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); # 设置整个当前Window的 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); ``` #### 修改状态栏颜色 [Android透明状态栏与状态栏文字颜色更改](https://www.jianshu.com/p/7392237bc1de "Android透明状态栏与状态栏文字颜色更改") [Android沉浸式状态栏(透明状态栏)最佳实现](https://blog.csdn.net/zephyr_g/article/details/53489320 "Android沉浸式状态栏(透明状态栏)最佳实现") ``` public static void setStatusBarColor(Activity activity, int colorId) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(activity.getResources().getColor(colorId)); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //使用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明 transparencyBar(activity); SystemBarTintManager tintManager = new SystemBarTintManager(activity); tintManager.setStatusBarTintEnabled(true); tintManager.setStatusBarTintResource(colorId); } } ``` #### 隐藏标题栏 ``` ActionBar actionBar = getActionBar(); # 如果是继承AppCompatActivity,就用getSupportActionBar() ActionBar actionBar=getSupportActionBar(); if(actionBar !=null) { actionBar.hide(); } ``` #### android 9以上http(方法一) 第一步:制作配置文件network_security_config.xml,下面是内容: ``` ``` 第二步:.修改项目的AndroidManifest.template文件 在applicaiton段增加networkSecurityConfig一行 ``` ``` 第三步:发布network_security_config.xml 通过Project->Deployment菜单,打开发布文件窗口,把 network_security_config.xml加进去  注意,发布文件路径,即Remote Path为res\xml\ 保存后,重新编译项目,正常情况下,问题就解决了。 如果以前编译过项目,为了要重新生成AndroidManifest.xml文件,你可以Clear项目,也可以手工把生成过的AndroidManifest.xml删除,这个文件在Android\Release文件夹中。手工删除,会减少编译的时间。 这一步也非常重要,我就遇到不重新生成AndroidManifest.xml的问题。 #### android 9以上http(方法二) 1、选择安卓平台编译一次程序,在项目根目录下会生成如下文件AndroidManifest.template.xml 2、打开此文件,在正确位置加上以下权限即可:android:usesCleartextTraffic="true" ``` ``` 直接在AndroidManifest.template.xml中定义使用http访问,确实简单! #### 动态申请权限 所属权限组权限日历READ_CALENDAR日历WRITE_CALENDAR相机CAMERA联系人READ_CONTACTS联系人WRITE_CONTACTS联系人GET_ACCOUNTS位置ACCESS_FINE_LOCATION位置ACCESS_COARSE_LOCATION麦克风RECORD_AUDIO电话READ_PHONE_STATE电话CALL_PHONE电话READ_CALL_LOG电话WRITE_CALL_LOG电话ADD_VOICEMAIL电话USE_SIP电话PROCESS_OUTGOING_CALLS传感器BODY_SENSORS短信SEND_SMS短信RECEIVE_SMS短信READ_SMS短信RECEIVE_WAP_PUSH短信RECEIVE_MMS存储READ_EXTERNAL_STORAGE存储WRITE_EXTERNAL_STORAGE ##### 1.需要在AndroidManifest.xml静态申请权限,否则无法动态申请权限,以下代码位置不能放错 ``` ``` ##### 2.java代码中写动态申请权限的逻辑 ``` public void requestPower() { //判断是否已经赋予权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.上表权限字符) != PackageManager.PERMISSION_GRANTED) { //如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.上表权限字符)) {//这里可以写个对话框之类的项向用户解释为什么要申请权限,并在对话框的确认键后续再次申请权限.它在用户选择"不再询问"的情况下返回false } else { //申请权限,字符串数组内是一个或多个要申请的权限,1是申请权限结果的返回参数,在onRequestPermissionsResult可以得知申请结果 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.上表权限字符,}, 1); } } } ``` ##### MainActivity中: 判断当前是否已经有某个权限: ``` if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PERMISSION_GRANTED) { ``` 请求一个权限: ``` ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); ``` 用户操作后的回调: ``` public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // ... } ``` ### 修改界面主题样式 android:theme="@android:style/Theme.Dialog" : Activity显示为对话框模式 android:theme="@android:style/Theme.NoTitleBar" : 不显示应用程序标题栏 android:theme="@android:style/Theme.NoTitleBar.Fullscreen" : 不显示应用程序标题栏,并全屏 android:theme="Theme.Light ": 背景为白色 android:theme="Theme.Light.NoTitleBar" : 白色背景并无标题栏 android:theme="Theme.Light.NoTitleBar.Fullscreen" : 白色背景,无标题栏,全屏 android:theme="Theme.Black" : 背景黑色 android:theme="Theme.Black.NoTitleBar" : 黑色背景并无标题栏 android:theme="Theme.Black.NoTitleBar.Fullscreen" : 黑色背景,无标题栏,全屏 android:theme="Theme.Wallpaper" : 用系统桌面为应用程序背景 android:theme="Theme.Wallpaper.NoTitleBar" : 用系统桌面为应用程序背景,且无标题栏 android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" : 用系统桌面为应用程序背景,无标题栏,全屏 android:theme="Theme.Translucent : 透明背景 android:theme="Theme.Translucent.NoTitleBar" : 透明背景并无标题 android:theme="Theme.Translucent.NoTitleBar.Fullscreen" : 透明背景并无标题,全屏 android:theme="Theme.Panel ": 面板风格显示 android:theme="Theme.Light.Panel" : 平板风格显示 ``` public void onCreate(Bundle savedInstanceState{ this.setTheme(R.style.Default); super.onCreate(savedInstanceState); setContentView(R.layout.main); } ``` ### 横竖屏问题 unspecified, 默认值,由系统决定,不同手机可能不一致 landscape,强制横屏显示 portrait,强制竖屏显 behind,与前一个activity方向相同 sensor,根据物理传感器方向转动,用户90度、180度、270度旋转手机方向,activity都更着变化 sensorLandscape,横屏旋转,一般横屏游戏会这样设置 sensorPortrait,竖屏旋转 nosensor,旋转设备时候,界面不会跟着旋转。初始化界面方向由系统控制 user,用户当前设置的方向 ##### activity中设置(方法一) ``` ``` ##### Java中设置(方法二) ``` setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); ``` ### 双击退出程序 参考文档:[Android:双击退出应用的实现](https://www.jianshu.com/p/6230811d219f "Android:双击退出应用的实现") ``` @Override public void onBackPressed() { long secondTime = System.currentTimeMillis(); if (secondTime - firstTime > 2000) { Toast.makeText(MainActivity.this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); firstTime = secondTime; } else{ finish(); } } ``` ### gradle 下载失败 ``` 1.修改gradle/wrapper.gradle-wrapper.properties distributionUrl=https\://downloads.gradle-dn.com/distributions/xxxx.zip 2.gradle 换成ali仓库 2.1只更换当前项目的 repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } } 2.2 如果想一次更改所有的仓库地址,可以在 USER_HOME/.gradle/文件夹下添加 init.gradle 文件来配置,如: allprojects{ repositories { def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/' all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) { remove repo } } } maven { url REPOSITORY_URL } } } ```