Android中照相,从相册选取照片,压缩,保存到手机内存,展示到界面,点击放大,上传。(含demo)

来源:互联网 发布:ipad打开淘宝老是跳转 编辑:程序博客网 时间:2024/05/16 16:10




相关博客:

http://blog.csdn.net/zhaihaohao1/article/details/41544087

http://blog.csdn.net/zhaihaohao1/article/details/41724763


项目结构:


核心代码:

activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   
    android:orientation="vertical" >


    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="拍照" 
        android:onClick="btn_onclick_camera"
        />


    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        
      
        />


</LinearLayout>

dialog_photo_entry.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >


    <ImageView
        android:id="@+id/large_image "
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="fitXY" >
    </ImageView>


</LinearLayout>

MainActivity中

public class MainActivity extends Activity {
private ImageView imageView1;
String picturePath = null;
File outFile = null;
final Map<String, String> params_image = new HashMap<String, String>();


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView1 = (ImageView) findViewById(R.id.imageView1);


}


/**
* 拍照按钮,点击事件

*/

public void btn_onclick_camera(View v) {
setView();
}


/**
* 拍照或从相册拿照片
*/
public void setView() {
final AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
String[] strs = { "拍照上传", "相册选取", "取消" };
builder.setItems(strs, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
Intent camera = new Intent(
"android.media.action.IMAGE_CAPTURE");
startActivityForResult(camera, 1);
break;
case 1:
Intent picture = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(picture, 2);
break;
case 2:
Toast.makeText(MainActivity.this, "关闭对话框", 10).show();
break;
}
}
});
builder.setCancelable(false);
builder.create().show();


}


/**
* 1取出拍照的结果存储到手机内存则pictures文件夹, 再从文件加下取出展示到界面,并且点击放大
* 2从相册中取出图片,压缩,放到dialog中,然后去出展示到界面 点击放大。
*/



@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bitmap = null;
File outDir = null;
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
// 这个路径,在手机内存下创建一个pictures的文件夹,把图片存在其中。
outDir = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
} else {
if (MainActivity.this != null) {
outDir = this.getFilesDir();
}
}
if (!outDir.exists()) {
outDir.mkdirs();
}


if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
if (data != null) {
// 直接获取照片,data是系统默认的(在系统中已经压缩过图片取出来就行了);
bitmap = (Bitmap) data.getExtras().get("data");
if (bitmap != null) {
showImageDialog(bitmap, "1", "陕A12345");
} else {


Toast.makeText(MainActivity.this, "图片获取失败,请重新选择", 10)
.show();
}
// 保存图片
try {
outFile = new File(outDir, System.currentTimeMillis()
+ ".jpg");
FileOutputStream fos = new FileOutputStream(outFile);


boolean flag = bitmap.compress(Bitmap.CompressFormat.JPEG,
100, fos);// 把数据写入文件
Log.i("1", "flag=" + flag);
if (flag) {
Toast.makeText(MainActivity.this,
"图片已保存至:" + outFile.getAbsolutePath(), 10)
.show();


// 展示图片,点击放大
String pathname = outFile.getAbsolutePath();// 绝对路径
final Bitmap myBitmap = BitmapFactory
.decodeFile(pathname);
imageView1.setImageBitmap(bitmap);
imageView1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getBigPicture(myBitmap);// 点击放大


}
});


} else {


Toast.makeText(MainActivity.this, "图片保存失败!", 10).show();


}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
}// 相册显示界面
else if (requestCode == 2 && data != null
&& resultCode == Activity.RESULT_OK) {
try {
Uri selectedImage = data.getData();
String[] filePathColumns = { MediaStore.Images.Media.DATA };
Cursor c = MainActivity.this.getContentResolver().query(
selectedImage, filePathColumns, null, null, null);
c.moveToFirst();
int columnIndex = c.getColumnIndex(filePathColumns[0]);
picturePath = c.getString(columnIndex);// 取出图片路径
Log.e("1", "图片路径" + picturePath);
c.close();


// 调用压缩方法压缩图片
    bitmap = createThumbnail(picturePath, 10);
// 保存图片到pictures文件夹下,上传的时候还要上传outFile
outFile = new File(outDir, System.currentTimeMillis() +
".jpg");
FileOutputStream fos = new FileOutputStream(outFile);
boolean flag = bitmap.compress(Bitmap.CompressFormat.JPEG,
100,
fos);// 把数据写入文件


if (bitmap != null) {
// 选择图片后显示在对话框内
showImageDialog(bitmap, "1", "陕A12345");
}
// 展示图片并点击放大
String pathname = outFile.getAbsolutePath();//绝对路径
                 final Bitmap myBitmap = BitmapFactory.decodeFile(pathname);
imageView1.setImageBitmap(myBitmap);
imageView1.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
getBigPicture(myBitmap);


}
});


} catch (Exception e) {
throw new RuntimeException(e);
}
}
}


/**

* 展示图片的dialog
*/

private void showImageDialog(Bitmap b, final String orderNo,
final String chepaihao) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);


builder.setTitle("请上传包含车牌的清晰照片");
View imgEntryView = View.inflate(MainActivity.this,
R.layout.dialog_photo_entry, null); // 加载自定义的布局文件
ImageView img = (ImageView) imgEntryView.findViewById(R.id.large_image);
if (b != null) {
Display display = MainActivity.this.getWindowManager()
.getDefaultDisplay();
int scaleWidth = display.getWidth();
int height = b.getHeight();// 图片的真实高度
int width = b.getWidth();// 图片的真实宽度
LayoutParams lp = (LayoutParams) img.getLayoutParams();
lp.width = scaleWidth;// 调整宽度
lp.height = (height * scaleWidth) / width;// 调整高度
img.setLayoutParams(lp);
img.setImageBitmap(b);
} else {


Toast.makeText(MainActivity.this, "获取照片失败", 10).show();
img.setVisibility(View.GONE);
}
builder.setView(imgEntryView); // 自定义dialog
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (MainActivity.this != null) {
// 判断网络
if (isNetworkConnected(MainActivity.this)) {
try {
/**
* 上传照片,没有正确的参数不能正确上传

*/
String str_uploadImage = UploadFileUtil
.uploadImage(
MainActivity.this,
RequestUrl.upload,
params_image,
outFile);


} catch (Exception e) {
e.printStackTrace();
}


} else {
Toast.makeText(MainActivity.this, "网络异常,请检查网络!", 10)
.show();
}
}
}
});
builder.setNegativeButton("取消", null);
builder.create().show();
}


/**
* 压缩图片


*/

private Bitmap createThumbnail(String filepath, int i) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = i;
return BitmapFactory.decodeFile(filepath, options);
}


/**
* 判断网络是否正常


*/

public boolean isNetworkConnected(Context context) {
if (context == null) {
return false;
}
ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo == null) {
return false;
} else {
return true;
}
}


/**
* 点击图片放大查看

*/

private void getBigPicture(Bitmap b) {
LayoutInflater inflater = LayoutInflater.from(this);
View imgEntryView = inflater.inflate(R.layout.dialog_photo_entry, null); // 加载自定义的布局文件
final AlertDialog dialog = new AlertDialog.Builder(this).create();
ImageView img = (ImageView) imgEntryView.findViewById(R.id.large_image);
if (b != null) {
Display display = MainActivity.this.getWindowManager()
.getDefaultDisplay();
int scaleWidth = display.getWidth();
int height = b.getHeight();// 图片的真实高度
int width = b.getWidth();// 图片的真实宽度
LayoutParams lp = (LayoutParams) img.getLayoutParams();
lp.width = scaleWidth;// 调整宽度
lp.height = (height * scaleWidth) / width;// 调整高度
img.setLayoutParams(lp);
img.setImageBitmap(b);
dialog.setView(imgEntryView); // 自定义dialog
dialog.show();
}
// 点击布局文件(也可以理解为点击大图)后关闭dialog,这里的dialog不需要按钮
imgEntryView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View paramView) {
if (dialog.isShowing()) {
dialog.cancel();
}
}
});
}


}// class

主清单中要配的权限:



    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

如果没有明白下载我的例子

http://download.csdn.net/detail/zhaihaohao1/8383861



0 0
原创粉丝点击