android 6.0 重启 丢失 壁纸,android6.0 壁纸设置流程讲解
主要以在launcher界面长按点击wallpaper按钮来设置壁纸的流程。
当我们点击wallpaper按钮后进入WallpaperPickerActivity.java界面,分三块上为设置按钮,中为将要设置的wallpaper图片,下为所有壁纸的缩略图。
选择好壁纸后点击设置按钮
/packages/apps/Launcher3/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java
// Action bar
// Show the custom action bar view
final ActionBar actionBar = getActionBar();
actionBar.setCustomView(R.layout.actionbar_set_wallpaper);
actionBar.getCustomView().setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// Ensure that a tile is slelected and loaded.
if (mSelectedTile != null && mCropView.getTileSource() != null) {
// Prevent user from selecting any new tile.
mWallpaperStrip.setVisibility(View.GONE);
actionBar.hide();
WallpaperTileInfo info = (WallpaperTileInfo) mSelectedTile.getTag();
info.onSave(WallpaperPickerActivity.this);//接着这个方法
} else {
// no tile was selected, so we just finish the activity and go back
setResult(Activity.RESULT_OK);
finish();
}
}
});
mSetWallpaperButton = findViewById(R.id.set_wallpaper_button);
上面这个方法调用FileWallpaperInfo中的onSave方法
/packages/apps/Launcher3/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java@FileWallpaperInfo @Override
public void onSave(WallpaperPickerActivity a)
{ a.setWallpaper(Uri.fromFile(mFile), true);//该setWallpaper在WallpaperCropActivity.java中实现
由上转入WallpaperCropActivity.java的setWallpaper()方法。
/packages/apps/Launcher3/WallpaperPicker/src/com/android/launcher3/WallpaperCropActivity.java
protected void setWallpaper(Uri uri, final boolean finishActivityWhenDone) {
int rotation = BitmapUtils.getRotationFromExif(getContext(), uri);
BitmapCropTask cropTask = new BitmapCropTask( getContext(), uri, null, rotation, 0, 0, true, false, null);//该task是图片处理与切割关键
final Point bounds = cropTask.getImageBounds();
Runnable onEndCrop = new Runnable() {
public void run() {
updateWallpaperDimensions(bounds.x, bounds.y);
if (finishActivityWhenDone) {
setResult(Activity.RESULT_OK);
finish();
} } };
cropTask.setCropSize(bounds.x, bounds.y);
cropTask.setOnEndRunnable(onEndCrop);
cropTask.setNoCrop(true);
cropTask.execute(); }
由上转入BitmapCropTask.java,具体代码就不全贴出,关键看cropBitmap()里的wallpaperManager.setStream(is);调用
/packages/apps/Launcher3/WallpaperPicker/src/com/android/gallery3d/common/BitmapCropTask.java
public boolean cropBitmap() {
boolean failure = false;
... ... ...
wallpaperManager.setStream(is);
... ... ...
}
我们看到最后通过流数据写入,将图片资源写入到wallpaper文件里面。具体实现我们转到wallpaperManager.java这个类
/frameworks/base/core/java/android/app/wallpaperManager.java
public void setStream(InputStream data) throws IOException {
if (sGlobals.mService == null) {
Log.w(TAG, "WallpaperService not running");
return;
}
try {
ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null,
mContext.getOpPackageName());//这个service调用是关键,获取wallpaper文件载体
if (fd == null) {
return;
}
FileOutputStream fos = null;
try {
fos = new ParcelFileDescriptor.AutoCloseOutputStream(fd);
setWallpaper(data, fos);//获取到wallpaper文件载体后往里面写如数据
} finally {
if (fos != null) {
fos.close();
}
}
} catch (RemoteException e) {
// Ignore
}
}
private void setWallpaper(InputStream data, FileOutputStream fos)//往wallpaper文件载体里面写数据
throws IOException {
byte[] buffer = new byte[32768];
int amt;
while ((amt=data.read(buffer)) > 0) {
fos.write(buffer, 0, amt);
}
}
我们看到上面有一个ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null,mContext.getOpPackageName());,该setWallpaper实现在WallpaperManagerService.java中实现,由于是远程service调用所以这里用到aidl.具体接口声明在
frameworks/base/core/java/android/app/IWallpaperManagerCallback.aidl,这里不列出。
public ParcelFileDescriptor setWallpaper(String name, String callingPackage) {
checkPermission(android.Manifest.permission.SET_WALLPAPER);
if (!isWallpaperSupported(callingPackage)) {
return null;
}
synchronized (mLock) {
if (DEBUG) Slog.v(TAG, "setWallpaper");
// /M: To support Smart Book @ {
if (isSmartBookSupport()) {
mHaveUsedSmartBook = false;
}
// /@ }
int userId = UserHandle.getCallingUserId();
WallpaperData wallpaper = getWallpaperSafeLocked(userId);
final long ident = Binder.clearCallingIdentity();
try {
ParcelFileDescriptor pfd = updateWallpaperBitmapLocked(name, wallpaper);
if (pfd != null) {
wallpaper.imageWallpaperPending = true;
}
return pfd;
} finally {
Binder.restoreCallingIdentity(ident);
}
}
}
ParcelFileDescriptor updateWallpaperBitmapLocked(String name, WallpaperData wallpaper) {
if (name == null) name = "";
try {
File dir = getWallpaperDir(wallpaper.userId);
if (!dir.exists()) {
dir.mkdir();
FileUtils.setPermissions(
dir.getPath(),
FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
-1, -1);
}
File file = new File(dir, mWallpaperFileName);
ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
MODE_CREATE|MODE_READ_WRITE|MODE_TRUNCATE);
if (!SELinux.restorecon(file)) {
return null;
}
wallpaper.name = name;
return fd;
} catch (FileNotFoundException e) {
Slog.w(TAG, "Error setting wallpaper", e);
}
return null;
}
private static File getWallpaperDir(int userId) {
return Environment.getUserSystemDirectory(userId);
}
android 6.0 重启 丢失 壁纸,android6.0 壁纸设置流程讲解相关推荐
- CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析
CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析 以下为SMDK开发板startup.s部分启动代码. ;------------------------------- ...
- android 铃声设置流程讲解
总体思路为 : 1.截取铃声 2.保存入sd卡 3.获取铃声信息 4.将信息和文件路径写入数据库获得铃声Uri 5.将获得的Uri设置为铃声. 核心实现:在 public class DefaultR ...
- android禁止压缩壁纸,Android6.0 屏蔽壁纸功能
软件平台:android6.0 硬件平台:MT6797 这两天搞了一个定制需求,也算是一个bug吧,6.0的系统前阵子做了系统裁剪,去掉了几十个app和service,结果一开始没出现的问题,裁剪后出 ...
- android 6.0 短信权限,Android6.0权限适配
Code4Android .jpg 前言 现在谈论Android权限适配可能有点没必要,因为网上关于权限适配的文章很多,搜一下Android6.0权限适配关键词能搜到一堆文章,而且很多写的还很不错.不 ...
- Android+6.0的全盘加密(,Android6.0强制全盘加密 隐私牺牲性能
Android6.0强制全盘加密 隐私牺牲性能 2015年10月20日 10:05作者:董岩编辑:董岩文章出处:泡泡网原创 分享 一款操作系统,刨去其可操作性,用户可能比较关注的就是其性能及安全性,两 ...
- android 蓝牙找不到电脑,Android6.0 蓝牙搜索不到设备原因
原因: 为提供更高的数据保护 Android6.0版本上增加了关于Wifi和蓝牙的权限,以下是官方文档说明: 图1 修改方法: 在AndroidManifest 中添加权限 或者 注意 如果targe ...
- android6.0 悬浮窗权限,Android6.0系统悬浮窗权限的问题解决方法
转自:http://blog.csdn.net/tangmanong/article/details/53114758 Android的窗口体系中,WindowManager占有非常重要的地位,平时我 ...
- android 勿扰模式代码,Android N Zen Mode (勿扰模式)设置流程
Android N去除了情景模式,取而代之的是勿扰模式.勿扰模式的入口有两处,下拉栏和设置声音里面.下面我们就从设置声音入口,看看勿扰模式的设置流程. 首先,勿扰模式的首页有三种选项,分别是仅允许优先 ...
- android 系统gpu 调试_[RK3288][Android6.0] 调试笔记 --- 读取当前DDR和GPU频率方法
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 ddr和gpu的clock都受dvfs模块管控, 所以只要执行: root@rk3288:/ # ...
最新文章
- 数据结构--单链表(数组)
- Codeforces Round #183 (Div. 2) C
- GitHub 仓库按大小排序
- java char字符转编码_一、java基础-数据类型_数据类型转化_字符编码_转义字符
- 将有序数组转为二叉搜索树
- 索引 Index -- 快速查找数据
- 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).
- Django讲课笔记08:定义商城的数据模型
- 群体智能优化算法之萤火虫群优化算法(Glowworm Swarm Optimization,GSO)
- mysql 哨兵_第六课补充01——主从复制原理,哨兵机制
- 快速隐藏/取消隐藏工作表
- Android 12 已来,你的 App 崩溃了吗?
- 团队管理的一些基本要点
- 一篇关于数学建模美赛论文撰写的心得
- CSS实现背景图片透明文字不透明效果的两种方法
- GDI+ 画路径(消除锯齿的效果很不错)
- SAP ABAP Odata
- Kubernetes基础:MacOS上设定Dashboard
- Java 标准与规范
- 智能指针实战讲解--龙之介《Effective C++》实验室
热门文章
- 零基础入门学习Python(6)-常用操作符
- java 写一个商店_Java Web开发之基于Session的购物商店实现方法
- R语言使用caret包构建遗传算法树模型(Tree Models from Genetic Algorithms )构建回归模型、通过method参数指定算法名称
- R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、自定义overall的标签名称
- R语言ggplot2可视化:可视化斜率图、对比同一数据对象随着时间推移多个状态的差异(Slope Chart)、例如、对比不同癌症5年期、10年期、15年期存活率的差异
- R语言psych包的corr.test函数计算相关性并给出所有相关性的显著性(Correlation matrix and tests of significance via corr.test())
- matplotlib可视化基本散点图、在图像多个指定区域绘制方框、进行自定义色彩填充(Draw Multiple Rectangles)
- R语言将dataframe数据从宽表(wide)变为长表(long)实战:tidyr包的gather函数、cdata包的unpivot_to_blocks函数、data.table使用melt函数
- R语言ggplot2可视化facet间隔设置语法实战
- Python使用pandas保存csv文件:如果文件存在则只添加内容(append),如果无表则同时写入表头和内容(write)