首页
统计
壁纸
留言板
友情链接
更多
直播
实用工具
Search
1
给孙小姐的一封情书
429 阅读
2
LabVIEW | 各版本及开发工具模块下载
217 阅读
3
armUbuntu系统构建
210 阅读
4
OpenWRT | 作为 旁路由/单臂路由/透明网关 设置 DDNS
194 阅读
5
armUbuntu | 开发板 移植 openssl 库
187 阅读
取次花丛懒回顾
默认分类
C#
MySQL
LabVIEW
Java
Android
PHP
Python
handsome
相册
百度地图
嵌入式
嵌入式Ubuntu
I.MX6ULL
linux
Unity
Golang
Rust
OpenHD
教学计划
Search
标签搜索
C#
handsome
Git
动态壁纸
开源
Unity3d
Unity
csharp
Moao
累计撰写
172
篇文章
累计收到
23
条评论
首页
栏目
取次花丛懒回顾
默认分类
C#
MySQL
LabVIEW
Java
Android
PHP
Python
handsome
相册
百度地图
嵌入式
嵌入式Ubuntu
I.MX6ULL
linux
Unity
Golang
Rust
OpenHD
教学计划
页面
统计
壁纸
留言板
友情链接
直播
实用工具
搜索到
5
篇与
的结果
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日
9 阅读
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日
6 阅读
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日
102 阅读
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日
76 阅读
0 评论
0 点赞
2020-12-08
Android-WebVIEW || net::ERR_CLEARTEXT_NOT_PERMITTED Android9.0无法加载url
从Android 9.0(API级别28)开始,默认情况下禁用明文支持。因此http的url均无法在webview中加载解决办法:在manifest 中application节点添加android:usesCleartextTraffic="true"添加后如下:<?xml version="1.0" encoding="utf-8"?> <manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <application ... android:usesCleartextTraffic="true" ...> ... </application> </manifest>附上链接:https://stackoverflow.com/questions/45940861/android-8-cleartext-http-traffic-not-permitted同时如果你还有webView 的问题,我遇到并记录的如下net:err_unknown_url_schemeandroid调用js方法Android9.0_P:ClassNotFoundException:Didn’t find class “org.apache.http.ProtocolVersion” on path:以上是开发中遇到的问题,后期有时间还会继续整理,或者您有更好的解决方法,添加更完善,不胜感激。欢迎留言交流,书到用时方恨少,纸上得来终觉浅!共勉。原文作者连接:https://blog.csdn.net/qq_33721320/article/details/84400825
2020年12月08日
60 阅读
0 评论
0 点赞