網站首頁 編程語言 正文
前言
首先說一下,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資源點擊下載
三、其他
(1)壁紙設置無效
和Launcher相關,Launcher界面是覆蓋在壁紙之上的。
(2)壁紙和桌面Launcher的關系
沒啥關系。但是Launcher可以覆蓋壁紙。
壁紙是與系統服務,以及SystemUi相關的。
你把/data/system/users/0/wallpaper文件刪除,會發現,壁紙背景是黑色的。
(3)壁紙設置的系統代碼流程
有興趣的看:https://www.jb51.net/article/44216.htm
(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
原文鏈接:https://blog.csdn.net/wenzhi20102321/article/details/123123609
相關推薦
- 2024-03-14 docker導出導入鏡像或容器
- 2022-06-14 C#通過cmd調用7z軟件實現壓縮和解壓文件_C#教程
- 2023-03-04 Google大佬都用的廣播goAsync源碼分析_Android
- 2022-11-11 Vant 3.* 底部安全區適配 部分頁面不生效
- 2022-09-20 Python?pip超詳細教程之pip的安裝與使用_python
- 2022-06-11 python中Event實現線程間同步介紹_python
- 2022-01-09 出現Got permission denied while trying to connect to
- 2022-01-28 laravel try異常abort只報出最外層
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支