Android开发之自动更换壁纸

本程序主要实现了:

1.使用AssetManager将assets目录中的文件复制到SD卡的指定位置

2.使用AlarmManager全局定时器,周期性的启动指定组件切换壁纸

3.使用SharedPreferences,将用户个性化的设置保存到手机(例如壁纸切换频率)

4.使用自定义标题栏

5.使用了GestureDetector手势检测器,允许用户滑动切屏

6.使用了overridePendingTransition,在切屏的时候有动画效果

程序运行效果图:

程序代码:

ChangeWallpaper.java:

package com.jph.changewallpaper;

import java.io.File;
import com.jph.util.Const;
import com.jph.util.CopyFolder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ToggleButton;
/**
 * Describe:</br>
 * </br>帮你换壁纸
 * </br>本程序主要实现了:
 * </br>1.使用AssetManager将assets目录中的文件复制到SD卡的指定位置
 * </br>2.使用AlarmManager全局定时器,周期性的启动指定组件切换壁纸
 * </br>3.使用SharedPreferences,将用户个性化的设置保存到手机(例如壁纸切换频率)
 * </br>4.使用自定义标题栏
 * </br>5.使用了GestureDetector手势检测器,允许用户滑动切屏
 * </br>6.使用了overridePendingTransition,在切屏的时候有动画效果
 * </br>@author jph
 * </br>Date:2014.08.05 *
 * */
public class ChangeWallpaper extends Activity implements OnGestureListener{
	//定义手势检测器实例
	GestureDetector detector;
    // 定义AlarmManager对象
	AlarmManager alarmManager;
	ToggleButton btnSwitch;
	ImageButton btnSetting;
	Intent intent;
	PendingIntent pi;
	//表示是不是第一次使用该应用
	boolean isFirstUse;
	//是不开启了自动切换壁纸
	boolean isLaunch;
	//壁纸切换别的频率
	int frequency;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//设置自定义标题栏标志  ,该语句必须放在setContentView之前
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.main);
		//设置自定义标题栏,改句必须放在setContentView之后
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
		btnSwitch=(ToggleButton)findViewById(R.id.btnSwitch);
		btnSetting=(ImageButton)findViewById(R.id.btnSetting);
		btnSetting.setOnClickListener(listener);
		//初始化手势检测器
		detector=new GestureDetector(this,this);
		// 指定启动ChangeService组件
		intent = new Intent(ChangeWallpaper.this,ChangeService.class);
		// 创建PendingIntent对象
		pi=PendingIntent.getService(ChangeWallpaper.this, 0, intent, 0);
		//获取系统的AlarmManager对象
		alarmManager=(AlarmManager)getSystemService(Service.ALARM_SERVICE);
		//初始化程序配置
		iniApp();
		btnSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				// TODO Auto-generated method stub
				isLaunch=isChecked;
				if (isChecked) {
					launchChangeService();
				}else {
					// 取消对pi的调度
					alarmManager.cancel(pi);
				}
			}
		});
	}
	//启动切换壁纸
	protected void launchChangeService() {
		// TODO Auto-generated method stub
		// 设置每隔5秒执行pi代表的组件一次
		alarmManager.setRepeating(AlarmManager.RTC_WAKEUP
						, 0, frequency, pi);
		Toast.makeText(ChangeWallpaper.this, "壁纸定时更换启动成功啦",
					Toast.LENGTH_SHORT).show();

	}
	OnClickListener listener=new OnClickListener() {
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			switch (v.getId()) {
			case R.id.btnSetting:
				showSetting();
				break;

			default:
				break;
			}
		}
	};
	//初始化应用,如果第一次使用,则将asset下的壁纸拷贝到SD卡上
	private void iniApp() {
		// TODO Auto-generated method stub
		//获取系统的SharedPreferences对象
		SharedPreferences preferences=getSharedPreferences("config", MODE_PRIVATE);
		//获取配置文件中的isFirstUse
		isFirstUse=preferences.getBoolean("isFirstUse", true);
		//获取配置文件中的frequency切换频率,默认五秒
		frequency=preferences.getInt(Const.SETING_FREQUENCY_Str, 5000);
		if (isFirstUse) {//如果第一次使用,则将asset下的壁纸拷贝到SD卡上
			//如果手机插入了SD卡,且程序有读取SD卡的权限
			if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
				//获取手机SD卡的目录
				File sdCardDir=Environment.getExternalStorageDirectory();
				String path=null;
				try {
					 path=sdCardDir.getCanonicalPath()+File.separator+"wallpaper";
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			CopyFolder cf=new CopyFolder(ChangeWallpaper.this, "wpics", path);
			cf.start();//启动线程
			}
		}
	}
	//显示程序设置界面
	protected void showSetting() {
		// TODO Auto-generated method stub
		//启动设置界面
		Intent intent=new Intent(ChangeWallpaper.this, SettingActivity.class);
		startActivityForResult(intent,Const.REQUESTCODE_FOR_SETTING);
		//设置切换动画,从右边进入,左边退出
		overridePendingTransition(R.anim.right_in, R.anim.left_out);
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		switch (requestCode) {
		case Const.REQUESTCODE_FOR_SETTING://如果从设置界面返回
			if (isLaunch) {//如果已经启动了自动且换壁纸
				//获取配置信息
				iniApp();
				launchChangeService();
			}
			break;

		default:
			break;
		}
	}
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		switch (keyCode) {
		case KeyEvent.KEYCODE_MENU://当按下菜单键跳转到设置界面
			showSetting();
			break;
		default:
			break;
		}
		return super.onKeyDown(keyCode, event);
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.change_wallpaper, menu);
		return true;
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		//将触碰事件交给GestureDetector处理
		return detector.onTouchEvent(event);
	}

	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
		//如果想右滑动的距离大于50mm
		if (e1.getX()-e2.getX()>50) {
			showSetting();
		}
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}
}

ChangeService.java(ChangeService切换壁纸类):

package com.jph.changewallpaper;

import java.io.File;
import java.util.ArrayList;
import com.jph.util.CopyFolder;
import android.app.Service;
import android.app.WallpaperManager;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.IBinder;
import android.widget.Toast;
/**
 * Describe:</br>
 * </br>ChangeService切换壁纸类
 * </br>获取SD卡的指定指定目录下的图片
 * </br>使用WallpaperManager来更换当前壁纸
 * </br>@author jph
 * </br>Date:2014.08.05 *
 * */
public class ChangeService extends Service {
	//定义一个存放图片名的数组
	String []fileNames;
	//定义一个存放图片路径的集合
	ArrayList<String>picPaths=new ArrayList<String>();
	// 定义系统的壁纸管理服务
	WallpaperManager wManager;
	// 定义当前所显示的壁纸
	int current = 0,flag=0;
	//创建一个CopyFolder类的对象
	CopyFolder cf=null;
	 public ChangeService() {
		// TODO Auto-generated constructor stub
		super();
	}
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		//初始化WallpaperManager
		wManager = WallpaperManager.getInstance(this);
		if (picPaths.isEmpty()) {//如果picPaths中还没有照片
			getPicPath();
		}
		flag++;
		Toast.makeText(ChangeService.this, "flag:"+flag,Toast.LENGTH_SHORT).show();
		System.out.println("==========================");
		System.out.println( "flag:"+flag);
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		System.out.println("==========================");
		System.out.println( "onStartCommand:"+flag);
		// 如果到了最后一张,系统重新开始
		if(current >picPaths.size())
			current = 0;
		try
		{
			//将指定路径的图片转换成bitmap
			Bitmap bitmap=BitmapFactory.decodeFile(picPaths.get(current++).toString());
			// 改变壁纸
			wManager.setBitmap(bitmap);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return START_STICKY;
	}
	//从SD卡的根目录下的wallpaper文件夹中读出图片路径到picPaths集合中
	public void getPicPath(){
		System.out.println("==========================");
		System.out.println( "getPicPath:"+flag);
		//如果手机插入了SD卡,且程序有读取SD卡的权限
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
			//获取手机SD卡的目录
			File sdCardDir=Environment.getExternalStorageDirectory();
			String path=null;
			try {
				 path=sdCardDir.getCanonicalPath()+File.separator+"wallpaper";
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			File file=new File(path);
			fileNames=file.list();
			//如果wallpaper目录不存在或为空则将assets目录下的壁纸复制到wallpaper目录下
			if (fileNames==null||fileNames.length==0) {
				if (cf==null) {
					cf=new CopyFolder(ChangeService.this, "wpics", path);
					cf.start();//启动线程
				}
			}
			picPaths.clear();//清空集合中的数据
			for (String picName:fileNames) {
				if (isPicture(picName)) {
					//将图片的完整路径添加到picPaths中
					picPaths.add(path+File.separator+picName);
				}
			}
		}
	}
	/**
	 * 判断文件类型是否为图片
	 * @param fileName String 用于判断的文件名
	 * @return boolean
	 * */
	public boolean isPicture(String fileName) {
		//存放图片格式的数组
		String []limit=new String[]{".png",".jpg",".gif",".jpeg" +
				".bmp",".PNG",".JPG",".GIF",".JPEG",".BMP"};
		for (String str:limit) {
			if (fileName.endsWith(str)) {//如果指定文件名为以上其中一种格式则返回true
				return true;
			}
		}
		return false;

	}
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
}

SettingActivity.java(设置菜单界面类)

package com.jph.changewallpaper;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jph.util.Const;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.GestureDetector.OnGestureListener;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleAdapter;
/**
 * Describe:</br>
 * </br>设置菜单界面类
 * </br>将用户个性化的设置保存到SharedPreferences中
 * </br>@author jph
 * </br>Date:2014.08.05
 * */
public class SettingActivity extends Activity implements OnGestureListener{
	private AlertDialog dialog;
    private AlertDialog.Builder builder;
	ListView list;
	//设置菜单标题
	String []itemTitles;
	//设置菜单图标
	int []itemIcos;
	//壁纸切换频率
	String frequencyString;
	//定义手势检测器实例
	GestureDetector detector;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.setting);
		//初始化手势检测器
		detector=new GestureDetector(this,this);
		list=(ListView)findViewById(R.id.list);
		//初始化ListView
		initList();
	}
	private void initList() {
		// TODO Auto-generated method stub
		//获取itemTitles.xml中的选项标题和图标
		itemTitles=getResources().getStringArray(R.array.itemTitles);
		itemIcos=new int[]{R.drawable.setting_fre,R.drawable.setting_fs
				,R.drawable.setting_redefault,R.drawable.setting_abuot};
		List<Map<String,Object>>listItems=new ArrayList<Map<String,Object>>();
		for (int i = 0; i < itemTitles.length; i++) {
			Map<String, Object>listItem=new HashMap<String, Object>();
			listItem.put("imgItemIco", itemIcos[i]);
			listItem.put("txtItemTitle", itemTitles[i]);
			listItems.add(listItem);
		}
		SimpleAdapter adapter=new SimpleAdapter(SettingActivity.this,listItems,
				R.layout.line, new String[]{"imgItemIco","txtItemTitle"},
				new int[]{R.id.imgItemIco,R.id.txtItemTitle});
		list.setAdapter(adapter);
		list.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				switch (position) {
				case 0:
					//设置壁纸切换的屏幕
					setFrequency();
					break;
				case 1:
					displayPattern();
					break;
				case 2:

					break;
				case 3:
					about();
					break;

				default:
					break;
				}
			}
		});
	}
	//设置壁纸的显示方式
	protected void displayPattern() {
		// TODO Auto-generated method stub
		final String item[]=new String[]{"平铺","拉伸","裁切","默认"};
		 DialogInterface.OnClickListener sListener=new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				frequencyString=item[which];
			}
		};
		builder=new AlertDialog.Builder(this);
		builder.setSingleChoiceItems(item, -1, sListener);
		dialog=builder.create();
		dialog.setTitle("请设置壁纸显示方式");
		 //创建按键监听器
		 DialogInterface.OnClickListener listener=new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				if(which==DialogInterface.BUTTON_POSITIVE)
				{//按下确定
					dialog.dismiss();
					if (frequencyString.endsWith("秒")) {
						frequencyString=frequencyString.replace("秒", "");
						//将String转换成int
						int frequency=Integer.parseInt(frequencyString)*1000;
						alterConfig(Const.SETING_FREQUENCY,frequency);
					}else if (frequencyString.endsWith("分钟")) {
						frequencyString=frequencyString.replace("分钟", "");
						//将String转换成int
						int frequency=Integer.parseInt(frequencyString)*1000*60;
						alterConfig(Const.SETING_FREQUENCY,frequency);
					}
				}else if(which==DialogInterface.BUTTON_NEGATIVE){//按下取消
					dialog.dismiss();
				}
			}
		};
		dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",listener);
		dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",listener);
		dialog.show();
	}
	//关于
	protected void about() {
		// TODO Auto-generated method stub
		LayoutInflater inflater=LayoutInflater.from(this);
		LinearLayout layout=(LinearLayout) inflater.inflate(R.layout.about, null);
		AlertDialog dialog=new AlertDialog.Builder(SettingActivity.this).create();
		dialog.setTitle("关于");
		dialog.setIcon(R.drawable.smile);
		dialog.setView(layout);
		dialog.show();
	}
	//设置显示频率
	protected void setFrequency() {
		// TODO Auto-generated method stub
		final String item[]=new String[]{"3秒","5秒","10秒","20秒","30秒","1分钟","5分钟","10分钟"};
		 DialogInterface.OnClickListener sListener=new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				frequencyString=item[which];
			}
		};
		builder=new AlertDialog.Builder(this);
    	builder.setSingleChoiceItems(item, -1, sListener);
		dialog=builder.create();
		dialog.setTitle("请设置壁纸切换的频率");
		 //创建按键监听器
		 DialogInterface.OnClickListener listener=new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				if(which==DialogInterface.BUTTON_POSITIVE)
				{//按下确定
					dialog.dismiss();
					if (frequencyString.endsWith("秒")) {
						frequencyString=frequencyString.replace("秒", "");
						//将String转换成int
						int frequency=Integer.parseInt(frequencyString)*1000;
						alterConfig(Const.SETING_FREQUENCY,frequency);
					}else if (frequencyString.endsWith("分钟")) {
						frequencyString=frequencyString.replace("分钟", "");
						//将String转换成int
						int frequency=Integer.parseInt(frequencyString)*1000*60;
						alterConfig(Const.SETING_FREQUENCY,frequency);
					}
				}else if(which==DialogInterface.BUTTON_NEGATIVE){//按下取消
					dialog.dismiss();
				}
			}
		};
		dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定",listener);
		dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",listener);
		dialog.show();
	}
	//修改配置文件
	protected void alterConfig(int flag, int frequency) {
		// TODO Auto-generated method stub
		SharedPreferences preferences=getSharedPreferences("config", MODE_PRIVATE);
		//获取SharedPreferences对应的Editor
		Editor editor=preferences.edit();
		switch (flag) {
		case Const.SETING_FREQUENCY:
			editor.putInt(Const.SETING_FREQUENCY_Str, frequency);
			break;

		default:
			break;
		}
		editor.commit();
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		//将触碰事件交给GestureDetector处理
		return detector.onTouchEvent(event);
	}

	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
		//如果向左滑动距离大于50mm
		if (e2.getX()-e1.getX()>50) {
			Intent intent=getIntent();
			setResult(Activity.RESULT_OK, intent);
			this.finish();
			overridePendingTransition(R.anim.left_in, R.anim.right_out);
		}
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}

}

工具类:

CopyFolder.java(复制assets中的文件到SD卡的指定位置)

package com.jph.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
/**
 * Describe:</br>
 * </br>从assets项目目录中复制文件及目录
 * </br>本类启用了一个新线程用于处理复制文件的耗时任务
 * </br>当所有的复制完成或复制文件出错时通知UI线程
 * </br>@author JPH
 * </br>Date:2014.07.30
 * */
public class CopyFolder extends Thread {
	//定义两个常量用于表示复制文件成功的标识
	public final static int COPY_FALSE=0x123,COPY_SUCCESS=0x456;
	String newPath,oldPath;
	Context context;
	public CopyFolder() {
		// TODO Auto-generated constructor stub
	}
	/**
     *  从assets目录中复制整个文件夹内容
     *  @param  context  Context 使用CopyFiles类的Activity
     *  @param  oldPath  String  原文件路径  如:img
     *  @param  newPath  String  复制后路径  如:xx:/bb/cc
     */
	public CopyFolder(Context context,String oldPath,String newPath) {
		this.context=context;
		this.oldPath=oldPath;
		this.newPath=newPath;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		copyFilesFassets(context,oldPath,newPath);
		SharedPreferences prference=context.getSharedPreferences("config",
				Context.MODE_PRIVATE);
		Editor editor=prference.edit();
		editor.putBoolean("isFirstUse", false);//写入使用标识
		editor.commit();//最后不要忘记将存入的数据进行提交
//		MainActivity.handler.sendEmptyMessage(COPY_SUCCESS);
	}
/**
 *  从assets目录中复制整个文件夹内容
 *  @param  context  Context 使用CopyFiles类的Activity
 *  @param  oldPath  String  原文件路径  如:/aa
 *  @param  newPath  String  复制后路径  如:xx:/bb/cc
 */
public void copyFilesFassets(Context context,String oldPath,String newPath) {
	try {
        String fileNames[] = context.getAssets().list(oldPath);//获取assets目录下的所有文件及目录名
        if (fileNames.length > 0) {//如果是目录
            File file = new File(newPath);
            file.mkdirs();//如果文件夹不存在,则递归
            for (String fileName : fileNames) {
                copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName);
            }
        } else {//如果是文件
            InputStream is = context.getAssets().open(oldPath);
            FileOutputStream fos = new FileOutputStream(new File(newPath));
            byte[] buffer = new byte[1024];
            int byteCount=0;
            while((byteCount=is.read(buffer))!=-1) {//循环从输入流读取 buffer字节
                fos.write(buffer, 0, byteCount);//将读取的输入流写入到输出流
            }
            fos.flush();//刷新缓冲区
            is.close();
            fos.close();
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        //如果捕捉到错误则通知UI线程
//		MainActivity.handler.sendEmptyMessage(COPY_FALSE);
    }
}
}

Const.java(常量类:提供程序中用到的主要常量)

package com.jph.util;
/**
 * Describe:</br>
 * </br>常量类
 * </br>提供程序中用到的主要常量
 * </br>@author jph
 * </br>Date:2014.08.05
 * */
public class Const {
	//壁纸切换频率标识
	public final static int SETING_FREQUENCY=0x0001;
	public final static String SETING_FREQUENCY_Str="frequency";
	//SettingActivity的请求码
	public final static int REQUESTCODE_FOR_SETTING=0x123;
	public Const() {
		// TODO Auto-generated constructor stub
	}

}

AndroidManifest.xml配置清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jph.changewallpaper"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <!-- 在SD卡中创建与删除文件权限 -->
	<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
	<!-- 向SD卡写入数据权限 -->
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
	<!-- 授予用户修改壁纸的权限 -->
	<uses-permission android:name="android.permission.SET_WALLPAPER" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.jph.changewallpaper.ChangeWallpaper"
            android:label="@string/app_name"
            android:theme="@style/style_title">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.jph.changewallpaper.SettingActivity"></activity>
        <!-- 注册 ChangeService-->
        <service android:name="com.jph.changewallpaper.ChangeService"></service>
    </application>

</manifest>

Android开发之自动更换壁纸

时间: 2024-11-05 19:27:50

Android开发之自动更换壁纸的相关文章

Android开发之自动登录功能的实现

在我们平时使用的手机应用都可以实现只需要登陆一次账号后,第二次进入应用直接跳转到效果界面的效果,还有QQ的登陆框是如何记忆我们的隐身登陆,保存账号选项的呢,这些都是通过使用SharedPreferences共享参数效果实现的,而无须使用数据库来存储.以下我们直接看详细代码分析. package com.example.account.login; import java.util.HashMap; import java.util.Map; import com.android.dao.MySQ

Android开发实例-自动生成题库的数独(一)

转载请注明出处:http://blog.csdn.net/einarzhang/article/details/44834259 本系列文章主要介绍如何利用Android开发一个自动生成题目的数独游戏.涉及的知识和技术如下所示: 挖洞算法自动生成数独题目 实现自定义View用于绘制数独盘 数据库的基本操作 看着市场上千篇一律的数独应用,他们大都来自于同一个开源应用,题目都是固定不变的那么100多道.我们就没有方法改变数独题目吗?经过百度搜索,终于找到了一篇自动生成数独题库的算法,感谢原作者的理论

ubuntu14.04自动更换桌面背景

作为一名同时喜欢windows 8.1和 ubuntu的用户,转入ubuntu系统后自然会觉得ubuntu的界面太过简陋,所有就在网上找到了一些自动更换壁纸的脚本命令来美化桌面,在此记录与分享. 以下是所用代码: 1 #!/bin/bash 2 3 #可用文件后缀名列表 4 readonly prefixs=("jpg" "jpeg" "png" "bmp") 5 6 #动态背景文件地址 7 #/usr/share/backg

撸一个自动换壁纸桌面应用

作为一名IT从业人员,一天当中陪着电脑的时间比陪家人的时间还要长.由于长时间盯着电脑屏幕,难免看厌了单调的桌面壁纸.本着换个壁纸,换种心情的目的,尝试了好几个自动换壁纸的windows桌面应用,要不是广告太烦,要不就是弹窗太惹人厌.于是,萌生了自已撸一个自动换壁纸桌面应用的想法. 现将换壁纸应用的构思.实现过程做以记录: 一.构思过程: 自动换壁纸这个诉求,拆开来看主要有两个方面.其一,能够更换桌面壁纸:其二,能够自动换壁纸. 先说说能够换壁纸.由于 window api 提供了相应的方法,原生

我的Android进阶之旅------&gt;Android使用AlarmManager全局定时器实现定时更换壁纸

该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供了clear()方法来清除壁纸,还提供了如下方法来设置壁纸. setResource(int resid)将壁纸设置为resid资源所代表的图片 setBitmap(Bitmap bitmap)将壁纸设置为bitmap所代表的位图 setStream(InputStream data)将壁纸设置为d

android开发中eclipse里xml开发的自动提示和使用帮助快捷键提示

Eclipse Android 代码自动提示功能 Eclipse for android 设置代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist > Auto activation triggers for Java ,设置框中默认是一个点, .abcdefghijklmnopqrstuvwxyz(, 打 开 Eclipse 依次选择 Window > Preference

如何关闭android studio开发环境自动保存

使用DW习惯了现在转到学习开发android,请问怎样关闭android studio的自动保存功能,然后按ctrl+s进行保存,因为有时候代码不想让其保存,他也自动保存了. File -> Setting -> General -> Save files on frame deactivation 和 Save files automatically if application is idle for .. sec 去掉

Android开发_*.R文件无法自动生成

问题描述:             今天是我决定专注Android开发的第一天,我在网上下载了一个数独游戏的源码,准备开始着手学习.在导入之后出现Java文件中import *.R文件报错,在gen目录下面没有找到R.java,于是自己创建了个,然后开始了寻找自动更新的方法. 问题解决:             在经过寻找后,最后发现是自己的项目中没有mainactivity.java.原因是项目的安装版本不同,我使用的是eclipse3.7.2加插件,因为版本比较低,不支持自定义自定义主界面,

Ubuntu自动生成更换壁纸配置文件脚本的困惑

花了一整个下午研究了下Ubuntu怎么自动切换壁纸.其实,感觉还是很简单的,主要就是修改目录/usr/share/backgrouds/contest/trusty.xml的配置文件. 它的格式是这样的: 1 <background> 2 <starttime> 3 <year>2009</year> 4 <month>08</month> 5 <day>04</day> 6 <hour>00<