Android开发壁纸的验证设置和确认功能实现demo

目录
  • 前言
  • 一、壁纸设置
    • (1)代码壁纸设置
      • 通过WallpaperManager设置
    • (2)adb壁纸设置
  • 二、壁纸验证
    • (1)系统应用代码中验证
    • (2)adb 复制文件验证
    • (3)apk验证,请看附件
  • 三、其他
    • (1)壁纸设置无效
    • (2)壁纸和桌面Launcher的关系
    • (3)壁纸设置的系统代码流程
    • (4)系统默认壁纸设置失败?

前言

首先说一下,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

以上就是Android开发壁纸的验证设置和确认功能实现demo的详细内容,更多关于Android开发壁纸验证设置确认的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android自定义动态壁纸开发详解

    看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现. 一.动态壁纸原理 如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单. 动态壁纸的本质其实就是一个服务在维护一个动态壁纸引擎Engine,所以我们看到的动态效果其实是通过这个引擎画出来的.而维护这个引擎的服务,就是WallpaperService.本篇文章并不讨论内部实现原理,只是让大家知道如何去实现动态壁纸,所以就不详细说了. 二.实现动态壁纸 大体上可分为三个步骤: 创建自定

  • Android开发学习之WallPaper设置壁纸详细介绍与实例

    今天和大家分享的是关于在Android中设置壁纸的方法,在Android中设置壁纸的方法有三种,分别是: 1.使用WallpaperManager的setResource(int ResourceID)方法 2.使用WallpaperManager的setBitmap(Bitmap bitmap)方法 3.重写ContextWrapper 类中提供的setWallpaper() 除此之外,我们还需要在应用程序中加入下列权限: <uses-permission android:name="a

  • Android自定义动态壁纸开发(时钟)

    看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现. 先看效果 上图是动态壁纸钟的一个时钟. 我们先来看看 Livewallpaper(即动态墙纸)的实现,Android的动态墙纸并不是GIF图片,而是一个标准的Android应用程序,也就是APK.既然是应用程序,当然意味着天生具有GIF图片不具备的功能--能与用户发生交互,而且动态的背景变化绝不仅仅局限于GIF图片那般只能是固定的几张图片的循环播放.但是我们在这里没有加入与用户交互的动作,只是加入一个时钟(当然时

  • 详解Android壁纸服务的启动过程

    壁纸基础 android中的壁纸分为动态壁纸和静态壁纸两种,两种类型的壁纸都以Service的类型运行在系统后台. 静态壁纸:仅以图片的形式进行展示对于静态壁纸,可以使用WallpaperManager中的getDrawable()等接口获取到当前的bitmap图像. 动态壁纸:显示的内容为动态的内容,同时可以对用户的操作做出响应对于动态壁纸的实时图像,是没办法通过android中原生的接口获取到,需要获取到动态壁纸的图像得自己修改源码. 壁纸实现时涉及的几个主要的类: WallpaperSer

  • Android编程之动态壁纸实例分析

    本文实例讲述了Android编程之动态壁纸.分享给大家供大家参考,具体如下: 从android 2.1版本起引入了动态壁纸的概念,熟悉android的人一定不会陌生.这里解释一个动态壁纸是怎么形成又是怎么工作的. 首先动态桌面的动态体现出这个组件是实时变化的,也就是说有一个后台在不停的刷新这个组件.联想到后台组件首先想到的就是service,从代码角度看,果然如此.每一个动态桌面都继承自WallpaperService,其中必须实现的抽象方法onCreateEngine,返回一个Engine对象

  • Android开发中的简单设置技巧集锦

    本文实例总结了Android开发中的简单设置技巧.分享给大家供大家参考,具体如下: 1开机图片: android-logo-mask.png android-logo-shine.png 这两个图片一个在上一个在下 ./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes/assets/images/android-logo-shine.png ./frameworks/base/core

  • Android开发实现可拖动排序的ListView功能【附源码下载】

    本文实例讲述了Android开发实现可拖动排序的ListView功能.分享给大家供大家参考,具体如下: 一.上图 二.简述 1.需要实现的效果是长按右侧可拖动部分布局实现列表项的拖动排序 2.当点击列表项前面的单选按钮时,在该条目右侧显示删除图标,点击该图标删除当前条目. 三.实现思路 借助github上的开源代码drag-sort-listview-master加以改造. 四.主要源码展示 1.Activity代码 package com.gengducun.dslvdemo; import

  • Android开发获取当前系统日期和时间功能示例

    本文实例讲述了Android开发获取当前系统日期和时间功能.分享给大家供大家参考,具体如下: 安卓 获得系统时间 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //创建线性布局管理器 LinearLayout layout = new Li

  • Android开发实现Switch控件修改样式功能示例【附源码下载】

    本文实例讲述了Android开发实现Switch控件修改样式功能.分享给大家供大家参考,具体如下: Android中自带的Switch控件在很多时候总觉得和整体系统风格不符,很多时候,自定义Switch是一种方法. 但其实不用这么麻烦,安卓自带的Switch通过修改一些属性,也可以达到和自定义Switch差不多的一个效果. 个人感觉,Switch的属性设置和其他控件还是有挺大区别的.因此,写下此文,方便有需要的同学参考. 先上效果图: 以上便是修改后效果 与 原生Switch的效果对比.代码在文

  • Android开发实现从相册中选择照片功能详解

    本文实例讲述了Android开发实现从相册中选择照片功能.分享给大家供大家参考,具体如下: 实际效果图: 代码实现: 1. 权限配置 2. 点击事件绑定 3. 相册访问 4. 根据路径设置图片 5. 其他方法 权限 首先,现在 mainfest.xml 文件中添加以下权限: <!--获取照片权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <us

  • Android开发实现的简单媒体播放器功能示例

    本文实例讲述了Android开发实现的简单媒体播放器功能.分享给大家供大家参考,具体如下: 一.概述: 因为播放视频需要很大的内存,所以必须使用surfaceview , surfaceview 里实现了双缓冲的功能, 二.全部代码: /** * @描述 使用surfaceview 创建视频 * @项目名称 App_Basic * @包名 com.example.basic.media * @类名 MediaPlayerActivity * @author chenlin * @date 201

  • Android开发实现自定义新闻加载页面功能实例

    本文实例讲述了Android开发实现自定义新闻加载页面功能.分享给大家供大家参考,具体如下: 一.概述: 1.效果演示: 2.说明:在新闻页面刚加载的时候,一般会出现五种状态 未知状态(STATE_UNKNOW).空状态(STATE_EMPTY).加载中(STATE_LOADING).错误(STATE_ERROT).成功(STATE_SUCCESS) 因为每个Detail页面都会出现,所以我们可以把他们封装成一个LoadPage的自定义view,可以复用 二.实现: 1.首先的定义三个布局,为什

  • Android开发实现的IntentUtil跳转多功能工具类【包含视频、音频、图片、摄像头等操作功能】

    本文实例讲述了Android开发实现的IntentUtil跳转多功能工具类.分享给大家供大家参考,具体如下: 说明:此工具类是本人开发中总结下来的,还有其它的跳转亲给我留言,希望大家一起把这个工具类打造成最全的跳转工具,谢谢! package com.android.chat.utils; import java.io.File; import java.io.Serializable; import android.app.Activity; import android.content.Co

  • Android开发实现的图片点击切换功能示例

    本文实例讲述了Android开发实现的图片点击切换功能.分享给大家供大家参考,具体如下: java 代码 public class MainActivity extends AppCompatActivity { //定义一个访问图片的数组 int[] images = new int[]{ R.drawable.java, R.drawable.javaee, R.drawable.swift, R.drawable.ajax, R.drawable.html, }; //用于图片切换 int

  • Android开发实现切换主题及换肤功能示例

    本文实例讲述了Android开发实现切换主题及换肤功能.分享给大家供大家参考,具体如下: 废话不说先看效果: 创建ColorTheme类用于主题更换: public class ColorTheme { AppCompatActivity ap; public ColorTheme(AppCompatActivity _ap){ap=_ap;} public void updateTheme(int _data){ String data=Integer.toString(_data); Fil

随机推荐