Android关于自定义更换手机桌面

来源:互联网 发布:生成对抗网络 知乎 编辑:程序博客网 时间:2024/04/30 03:34

本人这几天一直在研究一个应用的实现。此小应用为本人的私家老师——孙先生给本人留的作业。作业的内容为打开此应用即调用手机桌面为布局的ImageView,布局最下方设置两个Button,其一是设置背景图片,其二是更换背景图片。点击设置图片可弹出选择拍照还是去图库,图片可裁剪,选好的图片可以显示在布局上,被imageview调用。点击更换图片即可把手机桌面更换为选好的图片。

本人不才只实现了部分代码,可以把相机拍照及其裁剪的图片成功应用到手机桌面背景上,而在图库选择的及其裁剪的图片无法实现应用到手机桌面上。 本人想用 MainActivity.this.setWallpaper(BitmapFactory.decodeFile(picturePath))  实现图库及其裁剪后的图片更换到手机桌面 结果不成,望高人指点。


package com.example.changethewallpaper;



import java.io.File;
import java.io.IOException;
import java.io.InputStream;


import android.app.Activity;
import android.app.AlertDialog;
import android.app.WallpaperManager;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;


public class MainActivity extends Activity implements OnClickListener {


private ImageView iv;
private InputStream is;
private Uri uri;
private Button bt00;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) this.findViewById(R.id.image);
iv.setImageDrawable(getWallpaper());
findViewById(R.id.but01).setOnClickListener(this);
bt00 = (Button) this.findViewById(R.id.but00);
bt00.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

try {
MainActivity.this.setWallpaper(BitmapFactory.decodeFile(uri.getPath()));  //此处即为可调用拍照及其裁剪功能实现手机桌面的更换。

} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(MainActivity.this, "更换桌面成功!",
Toast.LENGTH_SHORT).show();


}
});

}


@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("选择图片位置")
.setCancelable(false)
.setPositiveButton("来自图库",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// TODO 跳到图库
Intent innerIntent = new Intent(
Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"


innerIntent.setType("image/*"); // 查看类型


// StringIMAGE_UNSPECIFIED="image/*";详细的类型在com.google.android.mms.ContentType中


Intent wrapperIntent = Intent.createChooser(
innerIntent, null);


startActivityForResult(wrapperIntent, 0);


}
})


.setNegativeButton("来自相机",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent i = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
// TODO....


File myImageDir = new File(
"/mnt/sdcard/DCIM/Camera/");


// 创建图片保存目录
if (!myImageDir.exists()) {


myImageDir.mkdirs();
}


// 根据时间来命名
File file = null;
try {
file = File.createTempFile(
"" + System.currentTimeMillis(),
".jpg", myImageDir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


uri = Uri.fromFile(file);


i.putExtra(MediaStore.EXTRA_OUTPUT, uri);


startActivityForResult(i, 1);


}
}).create().show();



}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == 0 && resultCode == RESULT_OK) {  //requestCode 各不一样
Uri uri = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };


Cursor cursor = getContentResolver().query(uri, filePathColumn,
null, null, null);
cursor.moveToFirst();


int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
iv.setImageBitmap(BitmapFactory.decodeFile(picturePath)); //调用图库图片到imageview
// TODO....
final Intent intent1 = new Intent("com.android.camera.action.CROP");
intent1.setDataAndType(uri, "image/*");
intent1.putExtra("crop", "true");
intent1.putExtra("aspectX", 1);
intent1.putExtra("aspectY", 1);
intent1.putExtra("outputX", 132);
intent1.putExtra("outputY", 132);
intent1.putExtra("return-data", false);//若为 true 则不会保存裁剪后的图片
startActivityForResult(intent1, 2);
Log.v("xuweiwei", "data0 ==" + data);
}


if (requestCode == 1&& resultCode == RESULT_OK) {


iv.setImageBitmap(BitmapFactory.decodeFile(uri.getPath()));//调用拍照照片到imageview
// TODO......
final Intent intent1 = new Intent("com.android.camera.action.CROP");
intent1.setDataAndType(uri, "image/*");
intent1.putExtra("crop", "true");
intent1.putExtra("aspectX", 1);
intent1.putExtra("aspectY", 1);
intent1.putExtra("outputX", 132);
intent1.putExtra("outputY", 132);
intent1.putExtra("return-data", false);
startActivityForResult(intent1, 3);
Log.v("xuweiwei", "data1 ==" + data);// null,保存在截图里
}
if (requestCode == 2&& resultCode == RESULT_OK) {
Uri uri = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };


Cursor cursor = getContentResolver().query(uri, filePathColumn,
null, null, null);
cursor.moveToFirst();


int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
iv.setImageBitmap(BitmapFactory.decodeFile(picturePath));//调用图库裁剪后的图片到imageview
}
if (requestCode == 3 && resultCode == RESULT_OK) {
Uri uri = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };


Cursor cursor = getContentResolver().query(uri, filePathColumn,
null, null, null);
cursor.moveToFirst();


int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
iv.setImageBitmap(BitmapFactory.decodeFile(picturePath));//调用裁剪后的拍照照片到imageview
}


}


}