客户功能需求:设置可以自定义的锁屏壁纸。
分析:首先分析系统壁纸设置过程,参考 上一期文章,Android5.1 设置壁纸流程简析。可以按照设置壁纸的方式,模仿实现设置锁屏壁纸的功能。
利用广播,实现设置锁屏壁纸功能。
具体实现:
①.packages/apps/Trebuchet/WallpaperPicker/res/layout/actionbar_set_wallpaper.xml
<!-- 增加Linerlayout布局 包裹两个控件-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" >
<com.android.launcher3.AlphaDisableableButton
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/ActionBarSetWallpaperStyle"
android:id="@+id/set_wallpaper_button"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="match_parent"
android:paddingRight="20dp"
android:drawableLeft="@drawable/ic_actionbar_accept"
android:drawablePadding="8dp"
android:gravity="start|center_vertical"
android:text="@string/wallpaper_instructions">
</com.android.launcher3.AlphaDisableableButton>
<!-- 模仿上面写一个设置锁屏的button 加入weight =1 ,使两按钮平分-->
<com.android.launcher3.AlphaDisableableButton
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/ActionBarSetWallpaperStyle"
android:id="@+id/set_lockscreen_button"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="match_parent"
android:paddingRight="20dp"
android:drawableLeft="@drawable/ic_actionbar_accept"
android:drawablePadding="8dp"
android:gravity="start|center_vertical"
android:text="@string/lock_screen_instructions">
</com.android.launcher3.AlphaDisableableButton>
②.packages/apps/Trebuchet/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java
protected void init() {
setContentView(R.layout.wallpaper_picker);
……
// Action bar
// Show the custom action bar view
final ActionBar actionBar = getActionBar();
actionBar.setCustomView(R.layout.actionbar_set_wallpaper);
//取消ActionBar点击事件,分别给两个按钮设置点击事件
/*actionBar.getCustomView().setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSelectedTile != null) {
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);
mSetLockScreenButton = findViewById(R.id.set_lockscreen_button);
mSetWallpaperButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSelectedTile != null) {
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();
}
}
});
mSetLockScreenButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSelectedTile != null) {
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();
}
Log.i("TAG","lockscreen button click");
}
});
在BitmapCropTask中实现
if (mSetWallpaper && mNoCrop) {
try {
InputStream is = regenerateInputStream();
if (is != null) {
//增加判断是否是点击设置锁屏壁纸按钮
if(isLockWallpaper==true){
byte[] outByteArray = toByteArray(is);//流转byte数字,用于发送广播
Intent intent = new Intent("android.yue.lockscreen.action");//自定义广播
intent.putExtra("outByteArray",outByteArray);
mContext.sendBroadcast(intent);
}else{
wallpaperManager.setStream(is);
Utils.closeSilently(is);
}
}
} catch (IOException e) {
Log.w(LOGTAG, "cannot write stream to wallpaper", e);
failure = true;
}
return !failure;
} else {
……
//else中同样有设置壁纸的方法
wallpaperManager.setStream(new ByteArrayInputStream(outByteArray));
//在这里同样需要做如上判读,具体实现同上。
}
(2)PhoneStatusBar.java中:
//begin 添加下面一行
PanelHolder mHolder;//成员变量
//end
...
protected PhoneStatusBarView makeStatusBarView() {
...
//begin 将下面第一行替换为第二行
PanelHolder holder = (PanelHolder) mStatusBarWindow.findViewById(R.id.panel_holder);
mHolder = (PanelHolder) mStatusBarWindow.findViewById(R.id.panel_holder);
//end
...
}
private void updateKeyguardState(boolean goingToFullShade, boolean fromShadeLocked) {
...
if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
//begin 添加下面一段
final Drawable drawable =new android.graphics.drawable.BitmapDrawable(bitmap);//广播中接收的bitmap,转换为Drawable,并设置
mHolder.post(new Runnable(){
public void run(){
mholder.setBackgroundResource(R.drawable.keyguard_wallpaper);
}
});
//end
mScrimController.setKeyguardShowing(true);
} else {
//begin 添加下面一行
mHolder.setBackgroundResource(0);
//end
mScrimController.setKeyguardShowing(false);
}
...
}
//加入广播,记得注册广播
private final BroadcastReceiver mTestReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if ("android.yue.lockscreen.action".equals(intent.getAction())) {
outByteArray= intent.getExtras().getByteArray("outByteArray");
Log.i("TAG","outByteArray=====------ "+outByteArray);
InputStream is = new ByteArrayInputStream(outByteArray);
bitmap = BitmapFactory.decodeStream(is);
}
}
};
大体是这样,代码细节没有贴全。仅此记录。