Android应用开发(31)屏幕背光控制

2023-11-08 19:20

本文主要是介绍Android应用开发(31)屏幕背光控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android应用开发学习笔记——目录索引

最近各手机厂商都在宣传万级调光,宣传数字越来越大,但是到底背光调节平滑度体验如何呢?

如最近realme 11 pro+ (MTK平台天玑7050),宣传20000级自动亮度调节。

发布会截图:

使用adb shell dumpsys SurfaceFlinger,发现 背光调节range[1~20479]


[LED state]display_0: support[1]brightness[0.393965] range[1~20479] current[8068]display_1: support[0]display_2: support[0]

测试验证了一下realme 11 pro+屏幕背光:

最小亮度1.7nit, 手动最大亮度500nit, HBM到800nit 。

从log看 最小dbv12, 手动最大18740,hbm 最大20479。

normal 区间:brightness[0.000049~0.915084] range[1~18740]

hbm 区间:brightness[0.915133~1.000000] range[18741~20479]

目前国内手机厂商竞争异常激烈,疯狂卷参数,但是这些参数对我们用户来说,具体有落实到实处吗?这是一个大大的问号

为了使用光学仪器410精准的测量屏幕背光情况,所以打写一个简单的背光测试apk。

一、获取背光控制最大最小值

frameworks/base/core/res/res/values/config.xml

     <!-- Note: This setting is deprecated, please useconfig_screenBrightnessSettingMinimumFloat instead --><integer name="config_screenBrightnessSettingMinimum">10</integer><!-- Note: This setting is deprecated, please useconfig_screenBrightnessSettingMaximumFloat instead --><integer name="config_screenBrightnessSettingMaximum">255</integer><!-- Note: This setting is deprecated, please useconfig_screenBrightnessSettingDefaultFloat instead --><integer name="config_screenBrightnessSettingDefault">102</integer><!-- Minimum screen brightness setting allowed by power manager.-2 is invalid so setting will resort to int value specified above.Set this to 0.0 to allow screen to go to minimal brightness.The user is forbidden from setting the brightness below this level. --><item name="config_screenBrightnessSettingMinimumFloat" format="float" type="dimen">-2</item><!-- Maximum screen brightness allowed by the power manager.-2 is invalid so setting will resort to int value specified above.Set this to 1.0 for maximum brightness range.The user is forbidden from setting the brightness above this level. --><item name="config_screenBrightnessSettingMaximumFloat" format="float" type="dimen">-2</item><!-- Default screen brightness setting set.-2 is invalid so setting will resort to int value specified above.Must be in the range specified by minimum and maximum. --><item name="config_screenBrightnessSettingDefaultFloat" format="float" type="dimen">-2</item>

直接通过代码获取config_screenBrightnessSettingMinimumconfig_screenBrightnessSettingMaximum


    //获取系统最小屏幕亮度:config_screenBrightnessSettingMinimumprivate int getScreenBrightnessSettingMinimum(Context context) {int screenBrightnessSettingMinimumId = getResources().getIdentifier("config_screenBrightnessSettingMinimum", "integer", "android");int screenBrightnessSettingMinimum = getResources().getInteger(screenBrightnessSettingMinimumId);return screenBrightnessSettingMinimum;}//获取系统最大屏幕亮度:config_screenBrightnessSettingMaximumprivate int getscreenBrightnessSettingMaximum(Context context) {int screenBrightnessSettingMaximumId = context.getResources().getIdentifier("config_screenBrightnessSettingMaximum", "integer", "android");int screenBrightnessSettingMaximum = context.getResources().getInteger(screenBrightnessSettingMaximumId);return screenBrightnessSettingMaximum;}

二、设置屏幕背光

第三方app设置屏幕背光有两种方法:

  1. 修改APP界面屏幕亮度,只影响本app,不会影响整个系统,退出app界面,恢复系统亮度

  1. 修改系统 Settings 中的屏幕亮度,影响所有APP

1.修改APP界面屏幕亮度

修改自身 APP 亮度比较简单,只需要在Activity 获取window的attributes,通过WindowManager.LayoutParams的screenBrightness变量调节


    //修改当前Activity界面的窗口亮度private void setWindowScreenBrightness(int brightness) {Window window = getWindow();WindowManager.LayoutParams lp = window.getAttributes();lp.screenBrightness = (float) brightness / (float)mBrightnessSettingMaximum;window.setAttributes(lp);}

只影响当前app界面,退出app,恢复到系统背光。

2.修改系统 Settings 中的屏幕亮度

2.1 AndroidManifest.xml添加如下权限


<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

2.2 非系统签名应用,检测是否有WRITE_SETTINGS,没有的话去请求用户授权


    //检测是否有WRITE_SETTINGS,没有的话去请求用户授权private boolean checkWriteSettingPermission(Activity context, int requestCode) {boolean permission;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {permission = Settings.System.canWrite(context);} else {permission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_SETTINGS) == PackageManager.PERMISSION_GRANTED;}if (!permission) {if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);intent.setData(Uri.parse("package:" + context.getPackageName()));context.startActivityForResult(intent, requestCode);} else {ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_SETTINGS}, requestCode);}}return permission;}
2.3 关闭自动亮度,设置手动调节背光模式

    //关闭光感,设置手动调节背光模式//SCREEN_BRIGHTNESS_MODE_AUTOMATIC 自动调节屏幕亮度模式值为1//SCREEN_BRIGHTNESS_MODE_MANUAL 手动调节屏幕亮度模式值为0public void setScreenManualMode(Context context) {ContentResolver contentResolver = context.getContentResolver();try {int mode = Settings.System.getInt(contentResolver,Settings.System.SCREEN_BRIGHTNESS_MODE);if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {Settings.System.putInt(contentResolver,Settings.System.SCREEN_BRIGHTNESS_MODE,Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);}} catch (Settings.SettingNotFoundException e) {e.printStackTrace();}}

2.4 获取当前背光和设置背光的方法


    //获取系统屏幕亮度private int getScreenBrightness(Context context) {int brightness = -1;ContentResolver resolver = context.getContentResolver();try {brightness = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS);} catch (Settings.SettingNotFoundException e) {e.printStackTrace();}return brightness;}// 修改系统的亮度值private void setScreenLight(int brightness) {Uri uri = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);ContentResolver contentResolver = getContentResolver();Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, brightness);contentResolver.notifyChange(uri, null);}

三、测试程序

测试程序使用第一种方法:修改APP界面屏幕亮度,不会影响其他APP

java:

MainActivity.java


package com.example.screenbrightnesstest;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.Manifest;public class MainActivity extends AppCompatActivity implements View.OnClickListener{private static final String TAG = "lzl-test";private Context mContext;private int mRoScreenBrightnessSettingMinimum;private int mRoScreenBrightnessSettingMaximum;private TextView mTextViewScreenBrightnessRange;private EditText mEditTextInputIntBrightnessMin;private int mInputIntIntBrightnessMin;private EditText mEditTextInputIntBrightnessMax;private int mInputIntIntBrightnessMax;private EditText mEditTextInputIntBrightness;private int mInputIntBrightness;private EditText mEditTextInputIntBrightnessAddStep;private int mInputIntBrightnessAddStep = 1;private TextView mTextViewOutputInfo;private int mColor = Color.RED;private int onClickCount = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = getApplicationContext();//获取系统最小屏幕亮度:config_screenBrightnessSettingMinimummRoScreenBrightnessSettingMinimum = getScreenBrightnessSettingMinimum(mContext);Log.d(TAG, "config_screenBrightnessSettingMinimum:" + mRoScreenBrightnessSettingMinimum);//获取系统最大屏幕亮度:config_screenBrightnessSettingMaximummRoScreenBrightnessSettingMaximum = getscreenBrightnessSettingMaximum(mContext);Log.d(TAG, "config_screenBrightnessSettingMaximum:" + mRoScreenBrightnessSettingMaximum);TextView textView =  (TextView)findViewById(R.id.tv_screenBrightnessSettingMinimum_val);textView.setText(String.format("%d",mRoScreenBrightnessSettingMinimum));textView =  (TextView)findViewById(R.id.tv_screenBrightnessSettingMaximum_val);textView.setText(String.format("%d",mRoScreenBrightnessSettingMaximum));mInputIntIntBrightnessMin = mRoScreenBrightnessSettingMinimum;mInputIntIntBrightnessMax = mRoScreenBrightnessSettingMaximum;mEditTextInputIntBrightnessMin = (EditText)findViewById(R.id.editTextNumber_screenBrightnessMinimum);mEditTextInputIntBrightnessMin.setText(String.format("%d",mInputIntIntBrightnessMin));mEditTextInputIntBrightnessMax = (EditText)findViewById(R.id.editTextNumber_screenBrightnessMaximum);mEditTextInputIntBrightnessMax.setText(String.format("%d",mInputIntIntBrightnessMax));mTextViewScreenBrightnessRange = (TextView)findViewById(R.id.tv_ScreenBrightness_range);mTextViewScreenBrightnessRange.setText(String.format("ScreenBrightness 测试,输入范围[%d~%d]",mInputIntIntBrightnessMin, mInputIntIntBrightnessMax));mEditTextInputIntBrightness = (EditText)findViewById(R.id.editTextNumber_screenBrightness);mInputIntBrightness = mInputIntIntBrightnessMax/2;mEditTextInputIntBrightness.setText(String.format("%d",mInputIntBrightness));mEditTextInputIntBrightnessAddStep = (EditText)findViewById(R.id.editTextNumber_screenBrightnessAddStep);mInputIntBrightnessAddStep = 1;mEditTextInputIntBrightnessAddStep.setText(String.format("%d",mInputIntBrightnessAddStep));findViewById(R.id.button_set_screenBrightnessMinimum).setOnClickListener(this);findViewById(R.id.button_set_screenBrightnessMaximum).setOnClickListener(this);findViewById(R.id.button_set_screenBrightness).setOnClickListener(this);findViewById(R.id.button_set_screenBrightnessAddStep).setOnClickListener(this);findViewById(R.id.button_add).setOnClickListener(this);findViewById(R.id.button_add).setOnClickListener(this);mTextViewOutputInfo = (TextView) findViewById(R.id.tv_output_info);}//获取系统最小屏幕亮度:config_screenBrightnessSettingMinimumprivate int getScreenBrightnessSettingMinimum(Context context) {int screenBrightnessSettingMinimumId = getResources().getIdentifier("config_screenBrightnessSettingMinimum", "integer", "android");int screenBrightnessSettingMinimum = getResources().getInteger(screenBrightnessSettingMinimumId);return screenBrightnessSettingMinimum;}//获取系统最大屏幕亮度:config_screenBrightnessSettingMaximumprivate int getscreenBrightnessSettingMaximum(Context context) {int screenBrightnessSettingMaximumId = context.getResources().getIdentifier("config_screenBrightnessSettingMaximum", "integer", "android");int screenBrightnessSettingMaximum = context.getResources().getInteger(screenBrightnessSettingMaximumId);return screenBrightnessSettingMaximum;}//修改当前Activity界面的窗口亮度private void setWindowScreenBrightness(int brightness) {Window window = getWindow();WindowManager.LayoutParams lp = window.getAttributes();Log.d(TAG, "Brightness:" + brightness + ", Max Brightness:" + mInputIntIntBrightnessMax);lp.screenBrightness = (float) brightness / (float)mInputIntIntBrightnessMax;window.setAttributes(lp);}private void showTextViewOutputInfo() {mColor = (onClickCount % 2 == 0) ? Color.RED : Color.BLUE;String str = String.format("范围:%d~%d\nint brightness[%d], float brightness[%f]\n自增步长: %d\n",mInputIntIntBrightnessMin, mInputIntIntBrightnessMax, mInputIntBrightness,(float) mInputIntBrightness / (float)mInputIntIntBrightnessMax, mInputIntBrightnessAddStep);mTextViewOutputInfo.setText(str);mTextViewOutputInfo.setTextColor(mColor);}@Overridepublic void onClick(View v) {onClickCount++;if (v.getId() == R.id.button_set_screenBrightnessMinimum) {if (!mEditTextInputIntBrightnessMin.getText().toString().isEmpty()) {mInputIntIntBrightnessMin = Integer.parseInt(mEditTextInputIntBrightnessMin.getText().toString());} else {mInputIntIntBrightnessMin = mRoScreenBrightnessSettingMaximum;}mTextViewScreenBrightnessRange.setText(String.format("ScreenBrightness 测试,输入范围[%d~%d]",mInputIntIntBrightnessMin, mInputIntIntBrightnessMax));showTextViewOutputInfo();} else if (v.getId() == R.id.button_set_screenBrightnessMaximum) {if (!mEditTextInputIntBrightnessMax.getText().toString().isEmpty()) {mInputIntIntBrightnessMax = Integer.parseInt(mEditTextInputIntBrightnessMax.getText().toString());} else {mInputIntIntBrightnessMax = mRoScreenBrightnessSettingMaximum;}mTextViewScreenBrightnessRange.setText(String.format("ScreenBrightness 测试,输入范围[%d~%d]",mInputIntIntBrightnessMin, mInputIntIntBrightnessMax));showTextViewOutputInfo();} else if (v.getId() == R.id.button_set_screenBrightness) {if (!mEditTextInputIntBrightness.getText().toString().isEmpty()) {mInputIntBrightness = Integer.parseInt(mEditTextInputIntBrightness.getText().toString());Log.d(TAG, "mIntBrightness:" + mInputIntBrightness);if (mInputIntBrightness < mInputIntIntBrightnessMin || mInputIntBrightness > mInputIntIntBrightnessMax) {Toast.makeText(getApplicationContext(), "请输入有效int型Brightness,range[" + mInputIntIntBrightnessMin +"~" + mInputIntIntBrightnessMax +"]", 1000).show();} else {setWindowScreenBrightness(mInputIntBrightness);showTextViewOutputInfo();}} else {Toast.makeText(getApplicationContext(), "请输入有效的参数", 1000).show();}} else if (v.getId() == R.id.button_set_screenBrightnessAddStep) {if (!mEditTextInputIntBrightnessAddStep.getText().toString().isEmpty()) {mInputIntBrightnessAddStep = Integer.parseInt(mEditTextInputIntBrightnessAddStep.getText().toString());Log.d(TAG, "mIntBrightnessAddStep:" + mInputIntBrightnessAddStep);if ((mInputIntBrightnessAddStep + mInputIntBrightness) > mInputIntIntBrightnessMax) {mInputIntBrightnessAddStep = 1;Toast.makeText(getApplicationContext(), "请输入有效的参数", 1000).show();}} else {Toast.makeText(getApplicationContext(), "请输入有效的参数", 1000).show();}showTextViewOutputInfo();} else if (v.getId() == R.id.button_add) {mInputIntBrightness = mInputIntBrightness + mInputIntBrightnessAddStep;Log.d(TAG, "mIntBrightness:" + mInputIntBrightness);if (mInputIntBrightness > mInputIntIntBrightnessMax) {Toast.makeText(getApplicationContext(), "Brightness超过了[" + mInputIntIntBrightnessMin +"~" + mInputIntIntBrightnessMax +"]范围", 1000).show();} else {setWindowScreenBrightness(mInputIntBrightness);showTextViewOutputInfo();}}  else {Log.e(TAG, "未知按键");}}
}

xml:

activity_main.xml layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_margin="5dp"><TextViewandroid:id="@+id/tv_screenBrightnessSetting_info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="30dp"android:layout_gravity="center"android:text="获取 screenBrightness 配置信息" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_screenBrightnessSettingMinimum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="config_screenBrightnessSettingMinimum:" /><TextViewandroid:id="@+id/tv_screenBrightnessSettingMinimum_val"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_screenBrightnessSettingMaximum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="config_screenBrightnessSettingMaximum:" /><TextViewandroid:id="@+id/tv_screenBrightnessSettingMaximum_val"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="" /></LinearLayout><TextViewandroid:id="@+id/textView_ScreenBrightness_min_max_info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="30dp"android:layout_gravity="center"android:text="ScreenBrightness 测试,设置最小/最大亮度值" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_screenBrightnessSettingMinimum_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="输入:" /><EditTextandroid:id="@+id/editTextNumber_screenBrightnessMinimum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:layout_weight="1"android:inputType="number" /><Buttonandroid:id="@+id/button_set_screenBrightnessMinimum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="设置" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_screenBrightnessSettingMaximum_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="输入:" /><EditTextandroid:id="@+id/editTextNumber_screenBrightnessMaximum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:layout_weight="1"android:inputType="number" /><Buttonandroid:id="@+id/button_set_screenBrightnessMaximum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="设置" /></LinearLayout><TextViewandroid:id="@+id/tv_ScreenBrightness_range"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="30dp"android:layout_gravity="center"android:text="ScreenBrightness 测试,输入范围" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_screenBrightness_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="输入:" /><EditTextandroid:id="@+id/editTextNumber_screenBrightness"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:layout_weight="1"android:inputType="number" /><Buttonandroid:id="@+id/button_set_screenBrightness"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="设置" /></LinearLayout><TextViewandroid:id="@+id/tv_screenBrightness_add_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="30dp"android:layout_gravity="center"android:text="screenBrightness自增步长设置" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_add_setp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="输入:" /><EditTextandroid:id="@+id/editTextNumber_screenBrightnessAddStep"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:layout_weight="1"android:inputType="number" /><Buttonandroid:id="@+id/button_set_screenBrightnessAddStep"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="设置" /></LinearLayout><Buttonandroid:id="@+id/button_add"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_weight="1"android:text="自增" /><TextViewandroid:id="@+id/tv_output"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="30dp"android:layout_gravity="center"android:text="输出信息" /><TextViewandroid:id="@+id/tv_output_info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="5dp"android:layout_gravity="center" /></LinearLayout></LinearLayout>

运行

我自己主力机器刚好是小米13Ultra,对比验证了一下:

  1. realme 11 pro+直接通过代码获取config_screenBrightnessSettingMinimumconfig_screenBrightnessSettingMaximum分别是1和255

  1. 小米13Ultra直接通过代码获取config_screenBrightnessSettingMinimumconfig_screenBrightnessSettingMaximum分别是15和16383

背光验证:

apk可以给手机准确的调背光,测试了下realme 11 pro+的亮度情况,手机整体 brightness 12-18740 对应1.74 -456nit的 2.2gamma形亮度曲线。 这个形状的亮度曲线,在低亮度的时候,亮度变化会比较小。

从理论最大500nit计算,最小的亮度差应该是0.0025nit,410光学仪器在1-10nit的测试精度是2%,人眼全黑的状态下可以识别的亮度差大约是0.025nit。所以这个精度,应该是没有必要。

而具体测试了前1000个亮度,发现整体表现并不好,连最起码的单调递增都没有做到,亮度曲线有轻微的反复。这也很像MTK平台万级背光方案调节亮度跟内容修改参数没有匹配很好的现象。

主观看,在低亮部分,也能看到一些轻微抖动,所以这个2w级背光调节,对我们用户的实际体验,应该是没有特别的优化效果。

源码

百度网盘链接:百度网盘 请输入提取码 提取码:test

github下载地址:

GitHub - liuzhengliang1102/AndroidStudio-LearnAppDevelopment

ScreenBrightnessTest目录

点此查看Android应用开发学习笔记的完整目录

这篇关于Android应用开发(31)屏幕背光控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/371958

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为