在开发项目中用到这个功能,之前就按照学过的拍照和选择照片的功能,所以也没在意就写了上去,可是最后发现在有些机子里面获取到的数据时空的,所以会导致程序崩溃的情况出现,网上找了很多例子大多都是一样的,还是有问题,后来就查看跟踪了拍照后返回的数据写了下面的代码相对大多数机子是可行的,经测试还是比较靠谱的,包括拍照后图片翻转了90度问题都没问题。直接看代码:
第一:拍照选择界面:
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
public class SelectPicPopupWindow extends Activity implements OnClickListener {
private Button btn_take_photo, btn_pick_photo, btn_cancel;
private LinearLayout layout;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alert_dialog);
intent = getIntent();
btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);
btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);
btn_cancel = (Button) this.findViewById(R.id.btn_cancel);
layout = (LinearLayout) findViewById(R.id.pop_layout);
// 添加选择窗口范围监听可以优先获取触点,即不再执行onTouchEvent()函数,点击其他地方时执行onTouchEvent()函数销毁Activity
layout.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
Toast.LENGTH_SHORT).show();
}
});
// 添加按钮监听
btn_cancel.setOnClickListener(this);
btn_pick_photo.setOnClickListener(this);
btn_take_photo.setOnClickListener(this);
}
// 实现onTouchEvent触屏函数但点击屏幕时销毁本Activity
@Override
public boolean onTouchEvent(MotionEvent event) {
finish();
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
return;
}
//选择完或者拍完照后会在这里处理,然后我们继续使用setResult返回Intent以便可以传递数据和调用
if (data.getExtras() != null)
intent.putExtras(data.getExtras());
if (data.getData()!= null)
intent.setData(data.getData());
setResult(1, intent);
finish();
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_take_photo:
try {
//拍照我们用Action为MediaStore.ACTION_IMAGE_CAPTURE,
//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
} catch (Exception e) {
e.printStackTrace();
}
break;
case R.id.btn_pick_photo:
try {
//选择照片的时候也一样,我们用Action为Intent.ACTION_GET_CONTENT,
//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 2);
} catch (ActivityNotFoundException e) {
}
break;
case R.id.btn_cancel:
finish();
break;
default:
break;
}
}
}
第二:显示照片界面:
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView photo;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
photo = (ImageView) this.findViewById(R.id.text);
// 把文字控件添加监听,点击弹出自定义窗口
photo.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//使用startActivityForResult启动SelectPicPopupWindow当返回到此Activity的时候就会调用onActivityResult函数
startActivityForResult(new Intent(MainActivity.this,
SelectPicPopupWindow.class), 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) {
case 1:
if (data != null) {
//取得返回的Uri,基本上选择照片的时候返回的是以Uri形式,但是在拍照中有得机子呢Uri是空的,所以要特别注意
Uri mImageCaptureUri = data.getData();
//返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取
if (mImageCaptureUri != null) {
Bitmap image;
try {
//这个方法是根据Uri获取Bitmap图片的静态方法
image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mImageCaptureUri);
if (image != null) {
photo.setImageBitmap(image);
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
Bundle extras = data.getExtras();
if (extras != null) {
//这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片
Bitmap image = extras.getParcelable("data");
if (image != null) {
photo.setImageBitmap(image);
}
}
}
}
break;
default:
break;
}
}
}
第三:如果需要保存图片到SD卡或者上传图片可以用下面代码:
public static String savePicToSdcard(Bitmap bitmap, String path,
String fileName) {
String filePath = "";
if (bitmap == null) {
return filePath;
} else {
filePath=path+ fileName;
File destFile = new File(filePath);
OutputStream os = null;
try {
os = new FileOutputStream(destFile);
bitmap.compress(CompressFormat.JPEG, 100, os);
os.flush();
os.close();
} catch (IOException e) {
filePath = "";
}
}
return filePath;
}
上传图片的话我们可以获取bitmap的流然后上传,如上面方式获取,如要上传,上传代码自己实现,这个比较简单。
运行效果图:
- 大小: 50.9 KB
分享到:
相关推荐
我在CSDN总结的一些比较靠谱的比较靠的4个项目希望能帮到大家。
Android环境配置(一步到位,绝对的靠谱)
靠谱的图片压缩方法图片压缩.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
libjpeg 进行大图压缩无损,包靠谱。网上的压缩代码都是坑,都是有损的。
CountdownTimer.rar 开发环境:ubuntu10.04+eclipse galileo
自己整理的一份比较靠谱的flash 面试题 自己整理的一份比较靠谱的flash 面试题 性能优化 各个框架。细枝末节。。等
网上看了好多android下调用脚本的例子,在没有root的情况下,大多只能执行一些简单的脚本命令,经验证,总结出一种还算比较有用的方法,可以较多数脚本,算是比较靠谱,共享下
推荐求职者-国内比较靠谱的招聘网站.doc
面试总结js 靠谱靠谱靠谱.md
安卓模拟器社区(靠谱社区)是中国最大的安卓模拟器交流论坛,下载靠谱助手安卓模拟器可在PC电脑上极速运行安卓手游和应用。最全手机游戏电脑版攻略心得!
靠谱助手是世界最大的安卓模拟器。内有百万应用可供你下载!
这些资源有很多,很全,好多都是 自己找人PS过来的 在其他网上搜到的基本不靠谱,这里的资源基本上满足飞机游戏的需求
近日要用到CKEditor实现图片上传,网上找了好多代码,要么跑不起来,要么不全,比如不知道如何返回值。跳了不少坑,现在彻底搞定。 目前上传用的是ASP.NET,可以随便切换成PHP、JAVA或其它的语言 只需要把ckeditor...
靠谱助手安卓PC模拟器
如题,网上找了好多都是抄来抄去的,无奈,还是自己写的最靠谱。用ViewPager实现手动切换,用Timer + Handler实现自动切换,左右完美无限滑动效果非常平滑,不卡,哈哈~Fragment里面我是写了文字,大家根据自己的...
读《马克思靠谱》心得.pdf
大甩卖了
文华财经指标公式源码期货软件指标赢顺云指标短线指标哪个比较靠谱.doc
文华财经指标公式源码WH6指标公式赢顺云日内指标哪个比较靠谱.doc
文华财经指标公式源码WH6指标公式赢顺云短线指标哪个比较靠谱.doc