android 比较靠谱的选择图片以及拍照,保存图片

在开发项目中用到这个功能,之前就按照学过的拍照和选择照片的功能,所以也没在意就写了上去,可是最后发现在有些机子里面获取到的数据时空的,所以会导致程序崩溃的情况出现,网上找了很多例子大多都是一样的,还是有问题,后来就查看跟踪了拍照后返回的数据写了下面的代码相对大多数机子是可行的,经测试还是比较靠谱的,包括拍照后图片翻转了90度问题都没问题。直接看代码:

第一:拍照选择界面:

 

Java代码    收藏代码
  1. import android.app.Activity;  
  2. import android.content.ActivityNotFoundException;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.provider.MediaStore;  
  6. import android.view.MotionEvent;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.LinearLayout;  
  11. import android.widget.Toast;  
  12.   
  13. public class SelectPicPopupWindow extends Activity implements OnClickListener {  
  14.   
  15.     private Button btn_take_photo, btn_pick_photo, btn_cancel;  
  16.     private LinearLayout layout;  
  17.     private Intent intent;  
  18.   
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.alert_dialog);  
  23.         intent = getIntent();  
  24.         btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);  
  25.         btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);  
  26.         btn_cancel = (Button) this.findViewById(R.id.btn_cancel);  
  27.   
  28.         layout = (LinearLayout) findViewById(R.id.pop_layout);  
  29.   
  30.         // 添加选择窗口范围监听可以优先获取触点,即不再执行onTouchEvent()函数,点击其他地方时执行onTouchEvent()函数销毁Activity  
  31.         layout.setOnClickListener(new OnClickListener() {  
  32.   
  33.             public void onClick(View v) {  
  34.                 // TODO Auto-generated method stub  
  35.                 Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",  
  36.                         Toast.LENGTH_SHORT).show();  
  37.             }  
  38.         });  
  39.         // 添加按钮监听  
  40.         btn_cancel.setOnClickListener(this);  
  41.         btn_pick_photo.setOnClickListener(this);  
  42.         btn_take_photo.setOnClickListener(this);  
  43.     }  
  44.   
  45.     // 实现onTouchEvent触屏函数但点击屏幕时销毁本Activity  
  46.     @Override  
  47.     public boolean onTouchEvent(MotionEvent event) {  
  48.         finish();  
  49.         return true;  
  50.     }  
  51.   
  52.     @Override  
  53.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  54.         if (resultCode != RESULT_OK) {  
  55.             return;  
  56.         }  
  57.         //选择完或者拍完照后会在这里处理,然后我们继续使用setResult返回Intent以便可以传递数据和调用  
  58.         if (data.getExtras() != null)  
  59.             intent.putExtras(data.getExtras());  
  60.         if (data.getData()!= null)  
  61.             intent.setData(data.getData());  
  62.         setResult(1, intent);  
  63.         finish();  
  64.   
  65.     }  
  66.   
  67.     public void onClick(View v) {  
  68.         switch (v.getId()) {  
  69.         case R.id.btn_take_photo:  
  70.             try {  
  71.                 //拍照我们用Action为MediaStore.ACTION_IMAGE_CAPTURE,  
  72.                 //有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个  
  73.                 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  74.                 intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);  
  75.                 startActivityForResult(intent, 1);  
  76.             } catch (Exception e) {  
  77.                 e.printStackTrace();  
  78.             }  
  79.             break;  
  80.         case R.id.btn_pick_photo:  
  81.             try {  
  82.                 //选择照片的时候也一样,我们用Action为Intent.ACTION_GET_CONTENT,  
  83.                 //有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个  
  84.                 Intent intent = new Intent();  
  85.                 intent.setType("image/*");  
  86.                 intent.setAction(Intent.ACTION_GET_CONTENT);  
  87.                 startActivityForResult(intent, 2);  
  88.             } catch (ActivityNotFoundException e) {  
  89.   
  90.             }  
  91.             break;  
  92.         case R.id.btn_cancel:  
  93.             finish();  
  94.             break;  
  95.         default:  
  96.             break;  
  97.         }  
  98.   
  99.     }  
  100.   
  101. }  

   

 

第二:显示照片界面:

 

Java代码    收藏代码
  1. import android.app.Activity;  
  2. import android.content.Intent;  
  3. import android.graphics.Bitmap;  
  4. import android.net.Uri;  
  5. import android.os.Bundle;  
  6. import android.provider.MediaStore;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.ImageView;  
  10.   
  11. public class MainActivity extends Activity {  
  12.     private ImageView photo;  
  13.   
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.activity_main);  
  18.         photo = (ImageView) this.findViewById(R.id.text);  
  19.         // 把文字控件添加监听,点击弹出自定义窗口  
  20.         photo.setOnClickListener(new OnClickListener() {  
  21.             public void onClick(View v) {  
  22.                 //使用startActivityForResult启动SelectPicPopupWindow当返回到此Activity的时候就会调用onActivityResult函数  
  23.                 startActivityForResult(new Intent(MainActivity.this,  
  24.                         SelectPicPopupWindow.class), 1);  
  25.             }  
  26.         });  
  27.     }  
  28.   
  29.     @Override  
  30.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  31.   
  32.         switch (resultCode) {  
  33.         case 1:  
  34.             if (data != null) {  
  35.                 //取得返回的Uri,基本上选择照片的时候返回的是以Uri形式,但是在拍照中有得机子呢Uri是空的,所以要特别注意  
  36.                 Uri mImageCaptureUri = data.getData();  
  37.                 //返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取  
  38.                 if (mImageCaptureUri != null) {  
  39.                     Bitmap image;  
  40.                     try {  
  41.                         //这个方法是根据Uri获取Bitmap图片的静态方法  
  42.                         image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mImageCaptureUri);  
  43.                         if (image != null) {  
  44.                             photo.setImageBitmap(image);  
  45.                         }  
  46.                     } catch (Exception e) {  
  47.                         e.printStackTrace();  
  48.                     }  
  49.                 } else {  
  50.                     Bundle extras = data.getExtras();  
  51.                     if (extras != null) {  
  52.                         //这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片  
  53.                         Bitmap image = extras.getParcelable("data");  
  54.                         if (image != null) {  
  55.                             photo.setImageBitmap(image);  
  56.                         }  
  57.                     }  
  58.                 }  
  59.   
  60.             }  
  61.             break;  
  62.         default:  
  63.             break;  
  64.   
  65.         }  
  66.     }  
  67.   
  68. }  

 

 

第三:如果需要保存图片到SD卡或者上传图片可以用下面代码:

 

Java代码    收藏代码
  1. public static String savePicToSdcard(Bitmap bitmap, String path,  
  2.             String fileName) {  
  3.         String filePath = "";  
  4.         if (bitmap == null) {  
  5.             return filePath;  
  6.         } else {  
  7.   
  8.             filePath=path+ fileName;  
  9.             File destFile = new File(filePath);  
  10.             OutputStream os = null;  
  11.             try {  
  12.                 os = new FileOutputStream(destFile);  
  13.                 bitmap.compress(CompressFormat.JPEG, 100, os);  
  14.                 os.flush();  
  15.                 os.close();  
  16.             } catch (IOException e) {  
  17.                 filePath = "";  
  18.             }  
  19.         }  
  20.         return filePath;  
  21.     }  

   

上传图片的话我们可以获取bitmap的流然后上传,如上面方式获取,如要上传,上传代码自己实现,这个比较简单。

转载于:https://www.cnblogs.com/huanjianlin/p/3570793.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值