IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 壁纸设置和确认 -> 正文阅读

[移动开发]Android 壁纸设置和确认

Android 壁纸设置和确认

android wallpaper包括锁屏壁纸和桌面壁纸,壁纸又区分静态和动态两种。
本文只介绍静态壁纸设置和确认。

首先说一下,Android手机壁纸Wallpaper和桌面Launcher是分开的,是两个不同的应用,
Wallpaper在系统Framework也有相关Manager和Service;
Android Launcher默认背景是透明的,覆盖在壁纸之上,
简单的理解就是Launcher就是一个显示了很多应用图标的apk。

Android壁纸设置后会存路径:

/data/system/users/0/wallpaper

这个wallpaper是一个文件,可以pull到电脑中添加后缀.png查看图片。

一、壁纸设置

(1)代码壁纸设置

AndroidManifest.xml中需要申明权限:

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

通过WallpaperManager设置

该方法可以直接将图片置为壁纸,对于所有平台的Android系统都使用。

设置Bitmap对象

try {
    WallpaperManager wpm = (WallpaperManager) getActivity().getSystemService(Context.WALLPAPER_SERVICE);
    if (wpm != null) {
        Bitmap mBitmap = BitmapFactory.decodeFile(path); //path为绝对路径
        //第一个参数是Bitmap对象,第二个参数是截取图片的大小矩形,第三个参数是是否备份
        wpm.setBitmap(mBitmap, new Rect(0, 0, right, bottom), true); 
        Log.i("liwenzhi", "wallpaper not null");
    }
} catch (IOException e) {
    Log.e(TAG, "Failed to set wallpaper: " + e);
}

Android 10及以后的版本要注意,普通应用连sdcard文件读取的权限都没有,因为加了沙箱机制了。

不过也是有方法解决的,1是添加系统签名android.uid.system,2是添加WRITE_MEDIA_STORAGE权限

    <uses-permission android:name = "android.permission.SET_WALLPAPER"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    //Android10及以后的版本,需要额外添加的权限
    <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"
        tools:ignore="ProtectedPermissions" />


还有一种方法是设置Source对象

指的是应用内部的图片文件,比如raw目录或者drawable目录,的文件
并且只支持PNG or JPEG格式的图片。


try {
    WallpaperManager wpm = WallpaperManager.getInstance(context);//同getActivity().getSystemService(Context.WALLPAPER_SERVICE);
    wpm.setResource(getResources().getIdentifier(name, "drawable", context.getPackageName()));
} catch (IOException e) {
    Log.e("TAG","error = " + e.getMessage());
}


该方式不需要读取权限,只要SET_WALLPAPER权限即可。

(2)adb壁纸设置

需要root权限!而且需要重启一次,才能看到效果,因为没有调用到系统刷新。

//root
adb root

//拉到电脑的D盘temp目录下,电脑中看
adb push D:/temp/wallpaper.png /data/system/users/0/wallpaper 

//拉到sdcard根目录,手机应用中看
adb push /sdcard/wallpaper.png /data/system/users/0/wallpaper

//需要重启才能生效
adb root

二、壁纸验证

需要权限(即系统应用、root权限)!

(1)系统应用代码中验证

打开壁纸文件

//显示壁纸图片,需要系统签名
    public void showWallpaper(View view) {
        try {
            Bitmap bitmap = BitmapFactory.decodeFile("/data/system/users/0/wallpaper");
            iv_wallpaper.setImageBitmap(bitmap);
        } catch (Exception e) {
            Log.e(TAG, "showWallpaper error = " + e.getMessage());
            tv_info.append("showWallpaper error = " + e.getMessage());
        }
    }
    
    

    //把壁纸pull到sdcard目录,需要系统签名
    public void pullWallpaperToSdcard(View view) {
        Log.i(TAG, "pullWallpaperToSdcard start");
        File fromFile = new File("/data/system/users/0/wallpaper");
        File toFile = new File("/sdcard/" + getTimeString() + "_wallpaper.png");
        copyFile(fromFile, toFile);
        Log.i(TAG, "pullWallpaperToSdcard end");
    }
    
    //获取当前时间的完整显示字符串
    private String getTimeString() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
        return format.format(new Date(System.currentTimeMillis()));
    }

    //复制文件操作
    private void copyFile(File fromFile, File toFile) {
        try {
            if (!toFile.getParentFile().exists()) {
                toFile.getParentFile().mkdirs();
            }

            java.io.FileInputStream fosfrom = new java.io.FileInputStream(fromFile);
            java.io.FileOutputStream fosto = new FileOutputStream(toFile);
            byte bt[] = new byte[1024];
            int c;
            while ((c = fosfrom.read(bt)) > 0) {
                fosto.write(bt, 0, c); //将内容写到新文件当中
            }
            fosfrom.close();
            fosto.close();
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
            tv_info.append("copyFile error = " + e.getMessage());
        }
    }


(2)adb 复制文件验证


//root权限
adb root

//拉到电脑的D盘temp目录下,电脑中看
adb pull /data/system/users/0/wallpaper D:/temp/wallpaper.png

//拉到sdcard根目录,手机应用中看
adb pull /data/system/users/0/wallpaper D:/temp/wallpaper.png

(3)apk验证,请看附件

这个wallpaper.apk只能替换壁纸,
若要显示和pull文件需要签名文件,替换项目中的签名文件即可。

简单的设置壁纸验证壁纸的apk资源:
https://download.csdn.net/download/wenzhi20102321/82630130

三、其他

(1)壁纸设置无效

和Launcher相关,Launcher界面是覆盖在壁纸之上的。

(2)壁纸和桌面Launcher的关系

没啥关系。但是Launcher可以覆盖壁纸。

壁纸是与系统服务,以及SystemUi相关的。

你把/data/system/users/0/wallpaper文件删除,会发现,壁纸背景是黑色的。

(3)壁纸设置的系统代码流程

有兴趣的看: https://blog.csdn.net/lj527409/article/details/79825015

(4)系统默认壁纸设置失败?


默认壁纸路径:frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png

要注意res同一个目录下有多个drawable文件夹,有的里面也有default_wallpaper.png图片。

如果是替换了drawable里面多个default_wallpaper.png图片没用反应,
那么要看看系统源码哪里出错了,多加一些打印看看进行具体情况分析,
里面是有读取default_wallpaper.png图片的代码逻辑,比如关键字:R.drawable.default_wallpaper。

共勉:人生短短,不可苟活。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:41:20  更:2022-02-28 15:44:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 16:33:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码