首页
统计
壁纸
留言板
友情链接
更多
直播
实用工具
Search
1
给孙小姐的一封情书
428 阅读
2
LabVIEW | 各版本及开发工具模块下载
216 阅读
3
armUbuntu系统构建
206 阅读
4
OpenWRT | 作为 旁路由/单臂路由/透明网关 设置 DDNS
187 阅读
5
armUbuntu | 开发板 移植 openssl 库
186 阅读
取次花丛懒回顾
默认分类
C#
MySQL
LabVIEW
Java
Android
PHP
Python
handsome
相册
百度地图
嵌入式
嵌入式Ubuntu
I.MX6ULL
linux
Unity
Golang
Rust
OpenHD
教学计划
Search
标签搜索
C#
handsome
Git
动态壁纸
开源
Unity3d
Unity
csharp
Moao
累计撰写
171
篇文章
累计收到
23
条评论
首页
栏目
取次花丛懒回顾
默认分类
C#
MySQL
LabVIEW
Java
Android
PHP
Python
handsome
相册
百度地图
嵌入式
嵌入式Ubuntu
I.MX6ULL
linux
Unity
Golang
Rust
OpenHD
教学计划
页面
统计
壁纸
留言板
友情链接
直播
实用工具
搜索到
7
篇与
的结果
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日
2 阅读
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日
3 阅读
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日
101 阅读
0 评论
0 点赞
2020-12-14
Java_Swing
package com.okk.hextostring;/* * ┏┓ ┏┓ + + * ┏━┛┻━━━━━┛┻━┓ + + * ┃ ┃ + + + * ┃ ━ ┃ + + + + * ████━████ ┃ + + + * ┃ ┃ + + * ┃ ━┻ ┃ + * ┃ ┃ + * ┗━━┓ ┏━━┛ + * ┃ ┃ + + + + * ┃ ┃ + + + + + + + + * ┃ ┃ + Code is far away from bug with the animal protecting * ┃ ┃ + 神兽保佑,代码无bug * ┃ ┃ + @author shy @date:2020-12-12 15:43 * ┃ ┃ + + + + + + + + + + + + + + + + + + + + + + + + + + + + * ┃ ┗━━━━━━━━━┓ + * ┃ ┣━┓ + * ┃ ┏━┛ + + * ┗━┓ ┓ ┏━━┳ ┓ ┏━━┛ + + * ┃ ┫ ┫ ┃ ┫ ┫ + + * ┗━┻━┛ ┗━┻━┛ + */ import javax.swing.*; import java.awt.*; public class Main { /** * 创建并显示GUI。出于线程安全考虑, * 这个方法在事件调用线程中调用 */ public static void createAndShowGUI(){ //确保一个漂亮的外观风格 JFrame.setDefaultLookAndFeelDecorated(true); //创建及设置窗口 JFrame jFrame = new JFrame("test"); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Setting the width and height of frame jFrame.setSize(350, 200); /* * 总结: * 1、单独使用setSize()时,是按照设置的大小显示的;此时不能使用pack(),否则按照pack()自动适配 * 2、单独使用pack()时,是按照组件的大小自动适配的 * 3、单独使用setPreferredSize()时,设置的大小无效,必须在后面添加pack()配合显示 * * pack() 调整此窗口的大小,以适合其子组件的首选大小和布局 * 就算JFrame用setSize来设定框体大小,用了pack()一样会改变成刚好能包含全部组件的框体。 * * 当使用setPreferredSize()时需要配合pack()显示,否则setPreferredSize()的设置效果不生效 * * */ // this.setSize(800, 600); /* * 总结: * 1、单独使用setSize()时,是按照设置的大小显示的;此时不能使用pack(),否则按照pack()自动适配 * 2、单独使用pack()时,是按照组件的大小自动适配的 * 3、单独使用setPreferredSize()时,设置的大小无效,必须在后面添加pack()配合显示 * * pack() 调整此窗口的大小,以适合其子组件的首选大小和布局 * 就算JFrame用setSize来设定框体大小,用了pack()一样会改变成刚好能包含全部组件的框体。 * * 当使用setPreferredSize()时需要配合pack()显示,否则setPreferredSize()的设置效果不生效 * * */ jFrame.setPreferredSize(new Dimension(800, 600)); // //添加helloworld标签 // JLabel label = new JLabel("HD"); // jFrame.getContentPane().add(label); /* 创建面板,这个类似于 HTML 的 div 标签 * 我们可以创建多个面板并在 JFrame 中指定位置 * 面板中我们可以添加文本字段,按钮及其他组件。 */ JPanel panel = new JPanel(); // 添加面板 jFrame.add(panel); /* * 调用用户定义的方法并添加组件到面板 */ placeComponents(panel); /** * JFrame.pack() * pack() 调整此窗口的大小,以适合其子组件的首选大小和布局 * 单独使用setSize()时,不能使用pack(),否则按照pack()自动适配 * * 单独使用pack()时,是按照组件的大小自动适配的 * * 单独使用setPreferredSize()时,设置的大小无效,必须在后面添加pack()配合显示,否则设置效果不生效 */ jFrame.pack(); //显示窗口 jFrame.setVisible(true); } private static void placeComponents(JPanel panel) { /* 布局部分我们这边不多做介绍 * 这边设置布局为 null */ panel.setLayout(null); // 创建 JLabel JLabel userLabel = new JLabel("User:"); /* 这个方法定义了组件的位置。 * setBounds(x, y, width, height) * x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。 */ userLabel.setBounds(10,20,80,25); panel.add(userLabel); /* * 创建文本域用于用户输入 */ JTextField userText = new JTextField(20); userText.setBounds(100,20,165,25); panel.add(userText); // 输入密码的文本域 JLabel passwordLabel = new JLabel("Password:"); passwordLabel.setBounds(10,50,80,25); panel.add(passwordLabel); /* *这个类似用于输入的文本域 * 但是输入的信息会以点号代替,用于包含密码的安全性 */ JPasswordField passwordText = new JPasswordField(20); passwordText.setBounds(100,50,165,25); panel.add(passwordText); // 创建登录按钮 JButton loginButton = new JButton("login"); loginButton.setBounds(10, 80, 80, 25); panel.add(loginButton); } public static void main(String[] args) { //显示GUi javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } }
2020年12月14日
77 阅读
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 点赞
1
2