Android開發(fā)壁紙的驗證設(shè)置和確認(rèn)功能實現(xiàn)demo
前言
首先說一下,Android手機(jī)壁紙Wallpaper和桌面Launcher是分開的,是兩個不同的應(yīng)用
Wallpaper在系統(tǒng)Framework也有相關(guān)Manager和Service;
Android Launcher默認(rèn)背景是透明的,覆蓋在壁紙之上
簡單的理解就是Launcher就是一個顯示了很多應(yīng)用圖標(biāo)的apk。
Android壁紙設(shè)置后會存路徑:
/data/system/users/0/wallpaper
這個wallpaper是一個文件,可以pull到電腦中添加后綴.png查看圖片。
一、壁紙設(shè)置
(1)代碼壁紙設(shè)置
AndroidManifest.xml中需要申明權(quán)限:
<uses-permission android:name = "android.permission.SET_WALLPAPER"/>
通過WallpaperManager設(shè)置
該方法可以直接將圖片置為壁紙,對于所有平臺的Android系統(tǒng)都使用。
設(shè)置Bitmap對象
try {
WallpaperManager wpm = (WallpaperManager) getActivity().getSystemService(Context.WALLPAPER_SERVICE);
if (wpm != null) {
Bitmap mBitmap = BitmapFactory.decodeFile(path); //path為絕對路徑
//第一個參數(shù)是Bitmap對象,第二個參數(shù)是截取圖片的大小矩形,第三個參數(shù)是是否備份
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及以后的版本要注意,普通應(yīng)用連sdcard文件讀取的權(quán)限都沒有,因為加了沙箱機(jī)制了。
不過也是有方法解決的
1是添加系統(tǒng)簽名android.uid.system
2是添加WRITE_MEDIA_STORAGE權(quán)限
<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及以后的版本,需要額外添加的權(quán)限
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"
tools:ignore="ProtectedPermissions" />
還有一種方法是設(shè)置Source對象
指的是應(yīng)用內(nèi)部的圖片文件,比如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());
}
該方式不需要讀取權(quán)限,只要SET_WALLPAPER權(quán)限即可。
(2)adb壁紙設(shè)置
需要root權(quán)限!而且需要重啟一次,才能看到效果,因為沒有調(diào)用到系統(tǒng)刷新。
//root adb root //拉到電腦的D盤temp目錄下,電腦中看 adb push D:/temp/wallpaper.png /data/system/users/0/wallpaper //拉到sdcard根目錄,手機(jī)應(yīng)用中看 adb push /sdcard/wallpaper.png /data/system/users/0/wallpaper //需要重啟才能生效 adb root
二、壁紙驗證
需要權(quán)限(即系統(tǒng)應(yīng)用、root權(quán)限)!
(1)系統(tǒng)應(yīng)用代碼中驗證
打開壁紙文件
//顯示壁紙圖片,需要系統(tǒng)簽名
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目錄,需要系統(tǒng)簽名
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");
}
//獲取當(dāng)前時間的完整顯示字符串
private String getTimeString() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
return format.format(new Date(System.currentTimeMillis()));
}
//復(fù)制文件操作
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); //將內(nèi)容寫到新文件當(dāng)中
}
fosfrom.close();
fosto.close();
} catch (Exception e) {
Log.e(TAG, e.getMessage());
tv_info.append("copyFile error = " + e.getMessage());
}
}
(2)adb 復(fù)制文件驗證
//root權(quán)限 adb root //拉到電腦的D盤temp目錄下,電腦中看 adb pull /data/system/users/0/wallpaper D:/temp/wallpaper.png //拉到sdcard根目錄,手機(jī)應(yīng)用中看 adb pull /data/system/users/0/wallpaper D:/temp/wallpaper.png
(3)apk驗證,請看附件
這個wallpaper.apk只能替換壁紙,若要顯示和pull文件需要簽名文件,替換項目中的簽名文件即可。
三、其他
(1)壁紙設(shè)置無效
和Launcher相關(guān),Launcher界面是覆蓋在壁紙之上的。
(2)壁紙和桌面Launcher的關(guān)系
沒啥關(guān)系。但是Launcher可以覆蓋壁紙。
壁紙是與系統(tǒng)服務(wù),以及SystemUi相關(guān)的。
你把/data/system/users/0/wallpaper文件刪除,會發(fā)現(xiàn),壁紙背景是黑色的。
(3)壁紙設(shè)置的系統(tǒng)代碼流程
有興趣的看:http://www.dbjr.com.cn/article/44216.htm
(4)系統(tǒng)默認(rèn)壁紙設(shè)置失???
默認(rèn)壁紙路徑:
frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
要注意res同一個目錄下有多個drawable文件夾,有的里面也有default_wallpaper.png圖片。
如果是替換了drawable里面多個default_wallpaper.png圖片沒用反應(yīng)
那么要看看系統(tǒng)源碼哪里出錯了,多加一些打印看看進(jìn)行具體情況分析
里面是有讀取default_wallpaper.png圖片的代碼邏輯,比如關(guān)鍵字:
R.drawable.default_wallpaper
以上就是Android開發(fā)壁紙的驗證設(shè)置和確認(rèn)功能實現(xiàn)demo的詳細(xì)內(nèi)容,更多關(guān)于Android開發(fā)壁紙驗證設(shè)置確認(rèn)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Android Material設(shè)計中陰影效果的實現(xiàn)方法
這篇文章主要介紹了Android Material設(shè)計中陰影效果的實現(xiàn)方法,包括自定義陰影的輪廓和裁剪等,需要的朋友可以參考下2016-04-04
android 觸屏的震動響應(yīng)接口調(diào)用方法
android 相關(guān)開發(fā)過程中,經(jīng)常會使用到觸屏的震動響應(yīng)接口,為此本文列出以下方法,想要了解的朋友可以參考下2012-11-11
Android Path繪制貝塞爾曲線實現(xiàn)QQ拖拽泡泡
本文主要介紹Android Path繪制貝塞爾曲線,這里整理相關(guān)資料并運用貝塞爾曲線實現(xiàn)QQ拖拽泡泡的示例,有興趣的小伙伴可以參考下2016-09-09
Flutter 快速實現(xiàn)聊天會話列表效果示例詳解
這篇文章主要為大家介紹了Flutter 快速實現(xiàn)聊天會話列表效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android實現(xiàn)類似網(wǎng)易新聞選項卡動態(tài)滑動效果
這篇文章主要介紹了Android實現(xiàn)類似網(wǎng)易新聞選項卡動態(tài)滑動效果的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11

