主要以在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 壁纸设置流程讲解相关推荐

  1. CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析

    CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析   以下为SMDK开发板startup.s部分启动代码.   ;------------------------------- ...

  2. android 铃声设置流程讲解

    总体思路为 : 1.截取铃声 2.保存入sd卡 3.获取铃声信息 4.将信息和文件路径写入数据库获得铃声Uri 5.将获得的Uri设置为铃声. 核心实现:在 public class DefaultR ...

  3. android禁止压缩壁纸,Android6.0 屏蔽壁纸功能

    软件平台:android6.0 硬件平台:MT6797 这两天搞了一个定制需求,也算是一个bug吧,6.0的系统前阵子做了系统裁剪,去掉了几十个app和service,结果一开始没出现的问题,裁剪后出 ...

  4. android 6.0 短信权限,Android6.0权限适配

    Code4Android .jpg 前言 现在谈论Android权限适配可能有点没必要,因为网上关于权限适配的文章很多,搜一下Android6.0权限适配关键词能搜到一堆文章,而且很多写的还很不错.不 ...

  5. Android+6.0的全盘加密(,Android6.0强制全盘加密 隐私牺牲性能

    Android6.0强制全盘加密 隐私牺牲性能 2015年10月20日 10:05作者:董岩编辑:董岩文章出处:泡泡网原创 分享 一款操作系统,刨去其可操作性,用户可能比较关注的就是其性能及安全性,两 ...

  6. android 蓝牙找不到电脑,Android6.0 蓝牙搜索不到设备原因

    原因: 为提供更高的数据保护 Android6.0版本上增加了关于Wifi和蓝牙的权限,以下是官方文档说明: 图1 修改方法: 在AndroidManifest 中添加权限 或者 注意 如果targe ...

  7. android6.0 悬浮窗权限,Android6.0系统悬浮窗权限的问题解决方法

    转自:http://blog.csdn.net/tangmanong/article/details/53114758 Android的窗口体系中,WindowManager占有非常重要的地位,平时我 ...

  8. android 勿扰模式代码,Android N Zen Mode (勿扰模式)设置流程

    Android N去除了情景模式,取而代之的是勿扰模式.勿扰模式的入口有两处,下拉栏和设置声音里面.下面我们就从设置声音入口,看看勿扰模式的设置流程. 首先,勿扰模式的首页有三种选项,分别是仅允许优先 ...

  9. android 系统gpu 调试_[RK3288][Android6.0] 调试笔记 --- 读取当前DDR和GPU频率方法

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 ddr和gpu的clock都受dvfs模块管控, 所以只要执行: root@rk3288:/ # ...

最新文章

  1. 数据结构--单链表(数组)
  2. Codeforces Round #183 (Div. 2) C
  3. GitHub 仓库按大小排序
  4. java char字符转编码_一、java基础-数据类型_数据类型转化_字符编码_转义字符
  5. 将有序数组转为二叉搜索树
  6. 索引 Index -- 快速查找数据
  7. 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).
  8. Django讲课笔记08:定义商城的数据模型
  9. 群体智能优化算法之萤火虫群优化算法(Glowworm Swarm Optimization,GSO)
  10. mysql 哨兵_第六课补充01——主从复制原理,哨兵机制
  11. 快速隐藏/取消隐藏工作表
  12. Android 12 已来,你的 App 崩溃了吗?
  13. 团队管理的一些基本要点
  14. 一篇关于数学建模美赛论文撰写的心得
  15. CSS实现背景图片透明文字不透明效果的两种方法
  16. GDI+ 画路径(消除锯齿的效果很不错)
  17. SAP ABAP Odata
  18. Kubernetes基础:MacOS上设定Dashboard
  19. Java 标准与规范
  20. 智能指针实战讲解--龙之介《Effective C++》实验室

热门文章

  1. 零基础入门学习Python(6)-常用操作符
  2. java 写一个商店_Java Web开发之基于Session的购物商店实现方法
  3. R语言使用caret包构建遗传算法树模型(Tree Models from Genetic Algorithms )构建回归模型、通过method参数指定算法名称
  4. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、自定义overall的标签名称
  5. R语言ggplot2可视化:可视化斜率图、对比同一数据对象随着时间推移多个状态的差异(Slope Chart)、例如、对比不同癌症5年期、10年期、15年期存活率的差异
  6. R语言psych包的corr.test函数计算相关性并给出所有相关性的显著性(Correlation matrix and tests of significance via corr.test())
  7. matplotlib可视化基本散点图、在图像多个指定区域绘制方框、进行自定义色彩填充(Draw Multiple Rectangles)
  8. R语言将dataframe数据从宽表(wide)变为长表(long)实战:tidyr包的gather函数、cdata包的unpivot_to_blocks函数、data.table使用melt函数
  9. R语言ggplot2可视化facet间隔设置语法实战
  10. Python使用pandas保存csv文件:如果文件存在则只添加内容(append),如果无表则同时写入表头和内容(write)