首页
统计
壁纸
留言板
友情链接
更多
直播
实用工具
Search
1
浏览器 | 开启Chrome和Edge的多线程下载功能(Parallel downloading)
607 阅读
2
给孙小姐的一封情书
439 阅读
3
LabVIEW | 各版本及开发工具模块下载
232 阅读
4
armUbuntu系统构建
220 阅读
5
OpenWRT | 作为 旁路由/单臂路由/透明网关 设置 DDNS
216 阅读
取次花丛懒回顾
默认分类
C#
MySQL
LabVIEW
Java
Android
PHP
Python
handsome
相册
百度地图
嵌入式
嵌入式Ubuntu
I.MX6ULL
linux
Unity
Golang
Rust
OpenHD
教学计划
Search
标签搜索
C#
handsome
Git
动态壁纸
开源
Unity3d
Unity
csharp
Moao
累计撰写
179
篇文章
累计收到
25
条评论
首页
栏目
取次花丛懒回顾
默认分类
C#
MySQL
LabVIEW
Java
Android
PHP
Python
handsome
相册
百度地图
嵌入式
嵌入式Ubuntu
I.MX6ULL
linux
Unity
Golang
Rust
OpenHD
教学计划
页面
统计
壁纸
留言板
友情链接
直播
实用工具
搜索到
6
篇与
的结果
2025-09-10
Android Studio || 国内主流镜像仓库全局配置方案
Android Studio || 国内主流镜像仓库全局配置方案适用于 Gradle 7.x/8.x,整合阿里云、华为云、腾讯云等稳定镜像源,一键加速依赖下载。一、方案总览方案作用域推荐场景备注① settings.gradle 项目级单仓库团队协作、CI 统一随 Git 提交,开箱即用② init.gradle 用户级全局个人开发一次配置,所有项目生效③ gradle-wrapper.propertiesGradle 分发包首次打开项目解决“Downloading gradle-8.x-bin.zip”卡顿④ gradle.properties 代理级全局网络公司代理/镜像加速底层 HTTP(S) 代理二、方案一:项目级 settings.gradle(团队最常用)把下面内容直接贴到项目根目录的 settings.gradle即可,无需修改模块级 build.gradle。\原来内容pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } rootProject.name = "xxx" include ':app'pluginManagement { repositories { // 1. 阿里云系列(全量同步 MavenCentral、Google、Gradle Plugin) maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } maven { url 'https://maven.aliyun.com/repository/central' } // 2. 华为云 maven { url 'https://repo.huaweicloud.com/repository/maven/' } // 3. 腾讯云 maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' } // 4. 网易 maven { url 'https://mirrors.163.com/maven/repository/maven-public/' } // 5. 保底官方源(顺序放最后) mavenCentral() google() // AndroidX 必备 mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { // 与上面保持一致,可 copy 同一段 maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/central' } maven { url 'https://repo.huaweicloud.com/repository/maven/' } maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' } maven { url 'https://mirrors.163.com/maven/repository/maven-public/' } google() mavenCentral() } } rootProject.name = "xxx" include ':app'顺序即优先级,最快的放最前;建议保留 google() 否则 AndroidX 可能缺失。三、方案二:用户级 init.gradle(个人电脑全局)路径 Windows:C:\Users\<电脑用户名称>\.gradle\init.gradle macOS/Linux:~/.gradle/init.gradleallprojects { repositories { // 先移除默认国外源 all { ArtifactRepository repo -> if (repo instanceof MavenArtifactRepository) { def url = repo.url.toString() if (url.contains('repo1.maven.org') || url.contains('jcenter.bintray.com') || url.contains('maven.google.com') || url.contains('plugins.gradle.org')) { remove repo } } } // 再按优先级添加国内镜像 maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } maven { url 'https://repo.huaweicloud.com/repository/maven/' } maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' } mavenCentral() google() } }保存后 重启 Gradle 守护进程:./gradlew --stop四、方案三:Gradle 分发包加速修改 gradle/wrapper/gradle-wrapper.properties:# 阿里云(推荐) distributionUrl=https\://mirrors.aliyun.com/gradle/gradle-8.5-bin.zip # 腾讯云 # distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.5-bin.zip # 华为云 # distributionUrl=https\://repo.huaweicloud.com/gradle/gradle-8.5-bin.zip仅影响 Gradle 本体 下载,不影响依赖。五、方案四:全局代理式镜像(备选)在 ~/.gradle/gradle.properties 追加:# 把整个 HTTP 流量转发到镜像(底层代理) systemProp.http.proxyHost=mirrors.aliyun.com systemProp.http.proxyPort=80 systemProp.https.proxyHost=mirrors.aliyun.com systemProp.https.proxyPort=80某些公司网络需要代理时可使用;不建议与前面的 init.gradle 混用,容易冲突。六、国内镜像地址速查表提供商地址覆盖范围阿里云公共https://maven.aliyun.com/repository/publicMavenCentral、JCenter阿里云 Googlehttps://maven.aliyun.com/repository/googleGoogle 仓库阿里云 Gradle 插件https://maven.aliyun.com/repository/gradle-pluginplugins.gradle.org华为云https://repo.huaweicloud.com/repository/maven/MavenCentral腾讯云https://mirrors.cloud.tencent.com/nexus/repository/maven-public/MavenCentral网易https://mirrors.163.com/maven/repository/maven-public/MavenCentral中科大https://mirrors.ustc.edu.cn/nexus/content/groups/public/MavenCentral七、最佳实践小结团队项目:直接用方案一,提交到 Git,新成员克隆即可。个人开发:方案二 init.gradle 最省事,一次配置,终身受益。多镜像组合使用,阿里云 → 华为云 → 腾讯云 → 官方源,容错+提速。务必保留 google(),否则 androidx.* 依赖会找不到。每隔 3-6 个月验证镜像是否同步最新版本;出现 Could not find 先换镜像顺序再排查。不同地区延迟不一样,ping 一下选最快:ping maven.aliyun.com ping repo.huaweicloud.com八、常见问题 FAQ现象解决配置后仍卡在“Download maven-metadata.xml”① ./gradlew --stop ② 删除 ~/.gradle/caches ③ 换镜像顺序Failed to resolve: androidx.xxx检查是否遗漏 google()依赖版本比官方低镜像同步延迟,把官方源放最后兜底即可九、一句话总结“项目级配置给团队,init.gradle 给自己,wrapper 加速装 Gradle,多镜像+官方兜底,顺序放对,缓存清掉,构建就能飞起!”现在复制粘贴,重新 Sync,享受秒级构建吧!
2025年09月10日
39 阅读
2 评论
0 点赞
2025-06-27
Android Studio | 设置国内代理(SDK 设置国内代理(阿里云镜像))
Android Studio 相关下载设置国内代理(阿里云镜像)(Android Git 仓库 国内代理/阿里云镜像)简介Android 上的 Git 存储库。下载地址阿里云镜像:https://mirrors.aliyun.com/android.googlesource.com/相关链接官方主页使用方法打开设置(settings)。进入“外观与行为”(Appearance & Behavior)。选择“系统设置”(System Settings)。点击“HTTP 代理”(Http Proxy)。选择“自动检测代理设置”(Auto-detected proxy settings)。勾选“自动代理配置 URL”(Automatic proxy configuration URL)。将上述下载地址(阿里云镜像:https://mirrors.aliyun.com/android.googlesource.com/)填入。
2025年06月27日
24 阅读
0 评论
0 点赞
2025-06-10
Android | 安卓动态申请权限,以蓝牙权限请求为例(使用 Android 的 `registerForActivityResult` API 简化权限请求)
使用 Android 的 registerForActivityResult API 简化权限请求在 Android 开发中,请求权限是一个常见的操作。从 Android 13 开始,Google 推出了新的 registerForActivityResult API,它让权限请求变得更简单。本文将展示如何用这个新 API 替换旧的 onRequestPermissionsResult 方法,并提供一个简单易懂的示例。为什么要替换?旧的 onRequestPermissionsResult 方法需要全局回调,用 requestCode 区分不同的权限请求,这使得代码复杂且难以维护。新的 registerForActivityResult API 让每个权限请求都有自己的回调,代码更清晰、更简洁。示例代码1. 权限请求工具类我们先定义一个工具类 PermissionRequestHelper,封装权限请求的逻辑。package net.moao.bluetoothuploader.utils; import android.app.Activity; import android.os.Build; import androidx.annotation.RequiresApi; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import java.util.HashMap; import java.util.Map; public class PermissionRequestHelper { private static final Map<String, String> PERMISSION_NAME_MAP = new HashMap<String, String>() {{ put("android.permission.ACCESS_FINE_LOCATION", "位置"); put("android.permission.BLUETOOTH_SCAN", "蓝牙扫描"); put("android.permission.BLUETOOTH_ADVERTISE", "蓝牙广告"); put("android.permission.BLUETOOTH_CONNECT", "蓝牙连接"); }}; /** * 获取权限的显示名称 * * @param permission 权限的英文名称 * @return 权限的显示名称 */ public static String getPermissionDisplayName(String permission) { return PERMISSION_NAME_MAP.getOrDefault(permission, permission); } /** * 请求权限 * * @param activity 当前的 Activity * @param permissions 请求的权限列表 * @param callback 权限请求结果的回调 */ @RequiresApi(api = Build.VERSION_CODES.TIRAMISU) public static void requestPermissions(Activity activity, String[] permissions, PermissionRequestCallback callback) { // 注册权限请求 ActivityResultLauncher<String[]> launcher = activity.registerForActivityResult( new ActivityResultContracts.RequestMultiplePermissions(), result -> { // 构建权限请求结果的字符串 StringBuilder resultBuilder = new StringBuilder(); for (String permission : permissions) { String permissionName = getPermissionDisplayName(permission); boolean isGranted = result.getOrDefault(permission, false); String status = isGranted ? "已开启" : "未开启"; resultBuilder.append(permissionName).append(": ").append(status).append("\n"); } // 调用回调方法 callback.onPermissionsResult(resultBuilder.toString()); } ); // 发起权限请求 launcher.launch(permissions); } /** * 权限请求结果的回调接口 */ public interface PermissionRequestCallback { /** * 权限请求结果的回调方法 * * @param result 权限请求的结果 */ void onPermissionsResult(String result); } }2. 在 Activity 中使用工具类接下来,我们展示如何在 Activity 中使用 PermissionRequestHelper 类来请求权限。package net.moao.bluetoothuploader; import android.os.Bundle; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import net.moao.bluetoothuploader.utils.PermissionRequestHelper; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 定义需要请求的权限 String[] requiredPermissions = { "android.permission.POST_NOTIFICATIONS", "android.permission.ACCESS_FINE_LOCATION", "android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT", "android.permission.BLUETOOTH_ADVERTISE" }; // 请求权限 PermissionRequestHelper.requestPermissions(this, requiredPermissions, new PermissionRequestHelper.PermissionRequestCallback() { @Override public void onPermissionsResult(String result) { // 处理权限请求的结果 Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show(); } }); } }代码解释1. 权限名称映射private static final Map<String, String> PERMISSION_NAME_MAP = new HashMap<String, String>() {{ put("android.permission.ACCESS_FINE_LOCATION", "位置"); put("android.permission.BLUETOOTH_SCAN", "蓝牙扫描"); put("android.permission.BLUETOOTH_ADVERTISE", "蓝牙广告"); put("android.permission.BLUETOOTH_CONNECT", "蓝牙连接"); }};PERMISSION_NAME_MAP:一个静态的 HashMap,把权限的英文名称映射为中文名称。这样在用户界面中展示权限名称时更友好。2. 获取权限的显示名称public static String getPermissionDisplayName(String permission) { return PERMISSION_NAME_MAP.getOrDefault(permission, permission); }getPermissionDisplayName:根据权限的英文名称获取对应的中文名称。如果权限名称不在映射表中,就返回原始的英文名称。3. 请求权限public static void requestPermissions(Activity activity, String[] permissions, PermissionRequestCallback callback) { // 注册权限请求 ActivityResultLauncher<String[]> launcher = activity.registerForActivityResult( new ActivityResultContracts.RequestMultiplePermissions(), result -> { // 构建权限请求结果的字符串 StringBuilder resultBuilder = new StringBuilder(); for (String permission : permissions) { String permissionName = getPermissionDisplayName(permission); boolean isGranted = result.getOrDefault(permission, false); String status = isGranted ? "已开启" : "未开启"; resultBuilder.append(permissionName).append(": ").append(status).append("\n"); } // 调用回调方法 callback.onPermissionsResult(resultBuilder.toString()); } ); // 发起权限请求 launcher.launch(permissions); }requestPermissions:这个方法用于请求权限。activity:当前的 Activity 实例。permissions:需要请求的权限列表。callback:权限请求结果的回调接口。ActivityResultLauncher:使用 registerForActivityResult 方法注册权限请求。ActivityResultContracts.RequestMultiplePermissions:指定请求多个权限。result:权限请求的结果,是一个 Map<String, Boolean>,键是权限名称,值是布尔值,表示权限是否被授予。resultBuilder:构建权限请求结果的字符串,用于在回调中展示。callback.onPermissionsResult:调用回调方法,把权限请求的结果传递给调用者。4. 权限请求结果的回调接口public interface PermissionRequestCallback { void onPermissionsResult(String result); }PermissionRequestCallback:一个回调接口,用于处理权限请求的结果。onPermissionsResult:权限请求结果的回调方法,参数 result 是权限请求结果的字符串。使用新 API 的好处代码更简洁:使用 registerForActivityResult API,代码更简洁,易于维护。避免全局回调:不再需要使用全局的 onRequestPermissionsResult 方法,避免了通过 requestCode 区分不同权限请求的复杂性。更直观:每个权限请求都有自己的回调,逻辑更清晰。
2025年06月10日
23 阅读
0 评论
0 点赞
2024-07-16
Android | 强制竖屏
方法一(代码中使用):setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//强制竖屏方法二(固定为垂直方向):android:screenOrientation="portrait"方法三(使activity不敏感屏幕朝向的变化):android:configChanges="orientation|keyboard|screenSize1.不要和screenOrientation一同使用,会降低效率不销毁Activity;2.当横竖屏切换的时候会直接调用onCreate方法中的onConfigurationChanged方法,而不是重新执行onCreate方法,如果没有使用这个属性就会重新调用onCreate方法了;PS:* 固定activity屏幕朝向 * landscape :横屏 * portrait :竖屏,不设置就是默认的 * sensor :自适应
2024年07月16日
106 阅读
0 评论
0 点赞
2020-12-09
Android-Activity || 隐藏状态栏、导航栏,解决触摸显示问题
Android 隐藏状态栏,导航栏,但是触碰屏幕会显示导航栏kotlin:window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN解决办法,想到两个(重写触摸事件,返回true||添加一个View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)第二个解决办法window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
2020年12月09日
82 阅读
0 评论
0 点赞
1
2