现在在做一个桌面相册,也就是一个widget,在桌面随机播放一个图片。功能比较简单,这可以说是一个demo吧,但是离真正做好,还是有差距的,主要是在在刷新界面方面,还有就是实时监听图片内容改变时,刷新界面这二个方面,应该还是有问题,把代码列出来,可以一起分析,研究一下。
1.HYGalleryImageInfo.java-------------图片信息描述类
/** hongyu hexiaoming desk elect gallery 20131220 start **/
public class HYGalleryImageInfo{
private int id;
private String title;
private String displayName;
private String mimeType;
private String path;
private long size;
public HYGalleryImageInfo() {
super();
}
public HYGalleryImageInfo(int id, String title, String displayName, String mimeType,String path, long size) {
super();
this.id = id;
this.title = title;
this.displayName = displayName;
this.mimeType = mimeType;
this.path = path;
this.size = size;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getMimeType() {
return mimeType;
}
public void setMimeType(String mimeType) {
this.mimeType = mimeType;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
}
/** hongyu hexiaoming desk elect gallery 20131220 end **/
2.UtilHelp.java----------工具类,主要是读取图片信息,图片缩略图,界面刷新
/** hongyu hexiaoming desk elect gallery 20131220 start **/
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.Handler;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.RemoteViews;
import java.io.File;
import java.util.ArrayList;
public class UtilHelp{
//public static final String uri = "MediaStore.Images.Media.EXTERNAL_CONTENT_URI";
public static final String uri = "content://media/external";
public static final String TAG = "UtilHelp";
public static final int countMax = 50;
public static final int width_widget = 400;
public static final int height_widget = 400;
//public static int mAppWidgetId = 0;
public static ArrayList<HYGalleryImageInfo> arrayList_ImageInfo;
//public static ArrayList<Drawable> arrayList_Dra;
//public static HYGalleryImageInfo firstImageInfo = null;
public static int image_count = 0;
public static HYGalleryImageInfo getFirstGalleryImageInfo(Context context){
HYGalleryImageInfo firstImageInfo = null;
try {
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,null,null,null);
if (cursor != null) {
cursor.moveToNext();
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.TITLE));
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
String displayName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));
String mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.MIME_TYPE));
long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE));
firstImageInfo = new HYGalleryImageInfo(id, title, displayName, mimeType,path, size);
cursor.close();
}
return firstImageInfo;
} catch (Exception e) {
// TODO: handle exception
Log.i(TAG, e.toString());
return null;
}
}
public static ArrayList<HYGalleryImageInfo> getGalleryImageInfo(Context context){
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,null,null,null);
int tem = 0;
if (cursor != null) {
arrayList_ImageInfo = new ArrayList<HYGalleryImageInfo>();
while (cursor.moveToNext()) {
tem = tem + 1;
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.TITLE));
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
String displayName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));
String mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.MIME_TYPE));
long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE));
HYGalleryImageInfo imageInfo = new HYGalleryImageInfo(id, title, displayName, mimeType,path, size);
arrayList_ImageInfo.add(imageInfo);
if(tem >= countMax){
break;
}
}
cursor.close();
}
image_count = arrayList_ImageInfo.size();
return arrayList_ImageInfo;
}
public static HYGalleryImageInfo getRandomGalleryImageInfo(Context context){
if(image_count == 0){
return null;
}
int random_int = (int) (Math.random()*image_count);
return arrayList_ImageInfo.get(random_int);
}
/**
* 根据指定的图像路径和大小来获取缩略图
* 此方法有两点好处:
* 1. 使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,
* 第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图。
* 2. 缩略图对于原图像来讲没有拉伸,这里使用了2.2版本的新工具ThumbnailUtils,使
* 用这个工具生成的图像不会被拉伸。
* @param imagePath 图像的路径
* @param width 指定输出图像的宽度
* @param height 指定输出图像的高度
* @return 生成的缩略图
*/
public static Bitmap getImageThumbnail(String imagePath, int width, int height) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 获取这个图片的宽和高,注意此处的bitmap为null
bitmap = BitmapFactory.decodeFile(imagePath, options);
options.inJustDecodeBounds = false; // 设为 false
// 计算缩放比
int h = options.outHeight;
int w = options.outWidth;
int beWidth = w / width;
int beHeight = h / height;
int be = 1;
if (beWidth < beHeight) {
be = beWidth;
} else {
be = beHeight;
}
if (be <= 0) {
be = 1;
}
options.inSampleSize = be;
// 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
bitmap = BitmapFactory.decodeFile(imagePath, options);
// 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
return bitmap;
}
public static void updateHYDeskEleGalleryWidget(HYGalleryImageInfo imageInfo,int mAppWidgetId,Context context){
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.hy_dest_ele_gallery);
if(imageInfo == null){
views.setImageViewResource(R.id.gallery_widget, R.drawable.ic_launcher);
Log.i(TAG, "imageInfo == null------1");
}else{
String imagePath = imageInfo.getPath();
Log.i(TAG, "updateHYDeskEleGalleryWidget---imagePath:"+imagePath);
Bitmap bitmap = UtilHelp.getImageThumbnail(imagePath, width_widget, height_widget);
if(bitmap == null){
views.setImageViewResource(R.id.gallery_widget, R.drawable.ic_launcher);
Log.i(TAG, "bitmap == null------2");
}else{
views.setImageViewBitmap(R.id.gallery_widget, bitmap);
File file = new File(imagePath);
if( file != null && file.isFile() == true){
Intent intent_click = new Intent();
intent_click.setAction(android.content.Intent.ACTION_VIEW);
intent_click.setDataAndType(Uri.fromFile(file), "image/*");
intent_click.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,mAppWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,intent_click, 0);
views.setOnClickPendingIntent(R.id.gallery_widget, pendingIntent);
Log.i(TAG, "updateHYDeskEleGalleryWidget---intent_click:"+file.getName().toString());
}
}
}
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(mAppWidgetId, views);
}
public static void sendIntentUpdateWidget(Context context){
Intent intent = new Intent("UPDATE_HY_DESK_ELE_GALLERY");
PendingIntent pi = PendingIntent.getBroadcast(context,0,intent,0);
AlarmManager am = (AlarmManager)context.getSystemService(context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),1*10000,pi);
}
public static void registerContentObservers(Context context,Handler handler) {
// HYContentObserver co = new HYContentObserver(context,handler);
// Uri myUri = Uri.parse(uri);
// context.getContentResolver().registerContentObserver(myUri,true,co);
}
public static void unregisterContentObserver(Context context) {
// HYContentObserver co = new HYContentObserver(context,new Handler());
// context.getContentResolver().unregisterContentObserver(co);
}
}
/** hongyu hexiaoming desk elect gallery 20131220 end **/
3.HYDeskEleGallerySharedPre.java-----xml数据保存
/*************************************************************************************************
* 版权所有 (C)2013, HONGYU
*
* 文件名称:HYDeskEleGallerySharedPre.java
* 内容摘要:xml数据存储类
* 当前版本:
* 作 者: hexiaoming
* 完成日期:2013-12-21
* 修改记录:
* 修改日期:
* 版 本 号:
* 修 改 人:
* 修改内容:
************************************************************************************************/
package com.hy.hy_dest_ele_gallery;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
/** hongyu hexiaoming desk elect gallery 20131220 start **/
public class HYDeskEleGallerySharedPre {
private Context context = null;
private SharedPreferences sp = null;
private Editor editor = null;
public static final String MySharedPreferencesName= "HYDeskEleGallerySharedPre";
public static final String Key_mAppWidgetId = "Key_mAppWidgetId";
public static final int Value_mAppWidgetId = -1;
public static final String Key_isHave = "Key_isHave";
public static final boolean Value_isHave = false;
public HYDeskEleGallerySharedPre(Context context){
this.context = context;
this.sp = this.context.getSharedPreferences(MySharedPreferencesName,0);
this.editor = sp.edit();
}
public int get_mAppWidgetId()
{
int mAppWidgetId = sp.getInt(Key_mAppWidgetId, Value_mAppWidgetId);
return mAppWidgetId;
}
public void set_mAppWidgetId(int mAppWidgetId)
{
editor.putInt(Key_mAppWidgetId, mAppWidgetId);
editor.commit();
}
public boolean get_isHave()
{
boolean isHave = sp.getBoolean(Key_isHave, Value_isHave);
return isHave;
}
public void set_isHave(boolean isHave)
{
editor.putBoolean(Key_isHave, isHave);
editor.commit();
}
}
/** hongyu hexiaoming desk elect gallery 20131220 end **/
4.HYDeskEleGalleryConf.jva--------创建widget
package com.hy.hy_dest_ele_gallery;
/** hongyu hexiaoming desk elect gallery 20131220 start **/
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class HYDeskEleGalleryConf extends Activity {
public static final String TAG = "HYDeskEleGalleryConf";
private int mAppWidgetId;
private boolean isHaveSP = false;
private int mAppWidgetIdSP = -1;
private HYDeskEleGallerySharedPre myHYSharedPre = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.i(TAG,"HYDeskEleGalleryConf---onCreate");
setResult(RESULT_CANCELED);
myHYSharedPre = new HYDeskEleGallerySharedPre(HYDeskEleGalleryConf.this);
isHaveSP = myHYSharedPre.get_isHave();
mAppWidgetIdSP = myHYSharedPre.get_mAppWidgetId();
if(isHaveSP == false && mAppWidgetIdSP == -1){
// Find the widget id from the intent.
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
}
// If they gave us an intent without the widget id, just bail.
if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish();
}
HYGalleryImageInfo imageInfo = UtilHelp.getFirstGalleryImageInfo(HYDeskEleGalleryConf.this);
UtilHelp.updateHYDeskEleGalleryWidget(imageInfo, mAppWidgetId, HYDeskEleGalleryConf.this);
UtilHelp.sendIntentUpdateWidget(HYDeskEleGalleryConf.this);
// return OK
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,mAppWidgetId);
setResult(RESULT_OK, resultValue);
//HYDeskEleGallerySharedPre myHYSharedPre = new HYDeskEleGallerySharedPre(HYDeskEleGalleryConf.this);
myHYSharedPre.set_isHave(true);
myHYSharedPre.set_mAppWidgetId(mAppWidgetId);
finish();
}else{
Toast.makeText(getApplicationContext(), R.string.widget_exist,Toast.LENGTH_SHORT).show();
finish();
}
}
}
/** hongyu hexiaoming desk elect gallery 20131220 end **/
5.HYDeskEleGalleryAppWidgetProvider.java------widget数据处理
package com.hy.hy_dest_ele_gallery;
/** hongyu hexiaoming desk elect gallery 20131220 start **/
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
public class HYDeskEleGalleryAppWidgetProvider extends AppWidgetProvider {
public static final String TAG = "HYDeskEleGalleryAppWidgetProvider";
@Override
public void onAppWidgetOptionsChanged(Context context,
AppWidgetManager appWidgetManager, int appWidgetId,
Bundle newOptions) {
// TODO Auto-generated method stub
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId,
newOptions);
Log.i(TAG, "onAppWidgetOptionsChanged");
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onDeleted(context, appWidgetIds);
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
Log.i(TAG, "this is [" + appWidgetId + "] onDelete!");
}
Log.i(TAG, "onDeleted");
HYDeskEleGallerySharedPre myHYSharedPre = new HYDeskEleGallerySharedPre(context);
myHYSharedPre.set_isHave(false);
myHYSharedPre.set_mAppWidgetId(-1);
//UtilHelp.unregisterContentObserver(context);
}
@Override
public void onDisabled(Context context) {
// TODO Auto-generated method stub
super.onDisabled(context);
}
@Override
public void onEnabled(Context context) {
// TODO Auto-generated method stub
super.onEnabled(context);
Log.i(TAG, "onEnabled");
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
super.onReceive(context, intent);
Log.i(TAG, "onReceive");
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
Log.i(TAG, "this is [" + appWidgetId + "] onUpdate!");
}
Log.i(TAG, "onUpdate");
//UtilHelp.registerContentObservers(context, new Handler());
}
}
/** hongyu hexiaoming desk elect gallery 20131220 end **/
6.UpdateHYDeskEleGalleryReceiver.java------更新widget的BroadcastReceiver
package com.hy.hy_dest_ele_gallery;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/** hongyu hexiaoming desk elect gallery 20131220 start **/
public class UpdateHYDeskEleGalleryReceiver extends BroadcastReceiver{
public static final String TAG = "UpdateHYDeskEleGalleryReceiver";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.i(TAG, "UpdateHYDeskEleGalleryReceiver---onReceive");
HYDeskEleGallerySharedPre myHYSharedPre = new HYDeskEleGallerySharedPre(context);
boolean isHaveSP = myHYSharedPre.get_isHave();
int mAppWidgetIdSP = myHYSharedPre.get_mAppWidgetId();
if(isHaveSP == true && mAppWidgetIdSP != -1){
// if(UtilHelp.arrayList_ImageInfo == null){
// UtilHelp.getGalleryImageInfo(context);
// }
UtilHelp.getGalleryImageInfo(context);
HYGalleryImageInfo imageInfo= UtilHelp.getRandomGalleryImageInfo(context);
UtilHelp.updateHYDeskEleGalleryWidget(imageInfo, mAppWidgetIdSP, context);
}
}
}
/** hongyu hexiaoming desk elect gallery 20131220 end **/
7.HYBootBroadcastReceiver.java----------开机启动BroadcastReceiver
package com.hy.hy_dest_ele_gallery;
/** hongyu hexiaoming desk elect gallery 20131220 start **/
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class HYBootBroadcastReceiver extends BroadcastReceiver{
public static final String ACTION_COMP = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(ACTION_COMP))
{
HYDeskEleGallerySharedPre myHYSharedPre = new HYDeskEleGallerySharedPre(context);
boolean isHaveSP = myHYSharedPre.get_isHave();
int mAppWidgetIdSP = myHYSharedPre.get_mAppWidgetId();
if(isHaveSP == true || mAppWidgetIdSP != -1){
HYGalleryImageInfo imageInfo = UtilHelp.getFirstGalleryImageInfo(context);
UtilHelp.updateHYDeskEleGalleryWidget(imageInfo, mAppWidgetIdSP, context);
}
UtilHelp.sendIntentUpdateWidget(context);
UtilHelp.registerContentObservers(context, null);
}
}
}
/** hongyu hexiaoming desk elect gallery 20131220 end **/
8.HYContentObserver.java-------内容监听器,这个还没有搞定,其实内容监听是没有问题,关键是没有找到注册的地方,有一点点怪
package com.hy.hy_dest_ele_gallery;
/** hongyu hexiaoming desk elect gallery 20131220 start **/
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;
public class HYContentObserver extends ContentObserver{
public static final String TAG = "HYContentObserver";
private Context context = null;
public HYContentObserver(Context context,Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
this.context = context;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
// TODO Auto-generated method stub
super.onChange(selfChange, uri);
}
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
// Log.i(TAG, "HYContentObserver---onChange");
//
// HYDeskEleGallerySharedPre myHYSharedPre = new HYDeskEleGallerySharedPre(context);
// boolean isHaveSP = myHYSharedPre.get_isHave();
// int mAppWidgetIdSP = myHYSharedPre.get_mAppWidgetId();
// if(isHaveSP == true || mAppWidgetIdSP != -1){
// HYGalleryImageInfo imageInfo = UtilHelp.getFirstGalleryImageInfo(context);
// UtilHelp.updateHYDeskEleGalleryWidget(imageInfo, mAppWidgetIdSP, context);
// }
}
}
//Uri smsUri = Uri.parse("content://sms");
//getContentResolver().registerContentObserver(smsUri,true,smsContentObserver);
/** hongyu hexiaoming desk elect gallery 20131220 end **/
9.res/layout/hy_dest_ele_gallery.xml-----布局文件
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gallery_widget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"/>
10.res/xml/hy_dest_ele_gallery_widget_provider.xml-------widget配置文件
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="82dp"
android:minHeight="82dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/hy_dest_ele_gallery"
android:configure="com.hy.hy_dest_ele_gallery.HYDeskEleGalleryConf">
</appwidget-provider>
11.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hy.hy_dest_ele_gallery"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name=".HYDeskEleGalleryAppWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/hy_dest_ele_gallery_widget_provider" />
</receiver>
<activity android:name=".HYDeskEleGalleryConf">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
<receiver android:name=".UpdateHYDeskEleGalleryReceiver">
<intent-filter>
<action android:name="UPDATE_HY_DESK_ELE_GALLERY" />
</intent-filter>
</receiver>
<receiver android:name=".HYBootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
</manifest>