android 剪切照片/相册,不依赖厂商API方案


1. 引入 cropImage 工程

  csdn内下载地址:http://download.csdn.net/detail/qhexin/7016925

  也可以到这里下载: https://github.com/lvillani/android-cropimage

2. 加入代码

public static Bitmap getPicFromBytes(byte[] bytes, BitmapFactory.Options opts) { 
        if (bytes != null) 
            if (opts != null) 
                return BitmapFactory.decodeByteArray(bytes, 0, bytes.length,opts); 
            else 
            {
            	return BitmapFactory.decodeByteArray(bytes, 0, bytes.length , null); 
            }
                
        return null; 
    } 
    
    public static byte[] readStream(InputStream inStream) throws Exception {
        byte[] buffer = new byte[1024];
        int len = -1;
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        while ((len = inStream.read(buffer)) != -1) {
                 outStream.write(buffer, 0, len);
        }
        byte[] data = outStream.toByteArray();
        outStream.close();
        inStream.close();
        return data;

   }
	
    public boolean saveBitmap(Bitmap bitmap,String url) throws IOException, NumberFormatException, JSONException
    {
            File file = new File(url);
            FileOutputStream out;
            try{
            	int bitMapWidth = bitmap.getWidth();
            	int bitMapHeight = bitmap.getHeight();
            	int wantWidth = Integer.valueOf(m_imagePickerJson.getString("want_width"));
            	int wantHeight = Integer.valueOf(m_imagePickerJson.getString("want_height"));
            	
            	
            	Log.d("sss","Majiang bitMapWidth="+bitMapWidth +
            			" bitMapHeight=" + bitMapHeight + " wantWidth=" + wantWidth + " wantHeight="+wantHeight );
            	
            	if(wantWidth == 0)
            	{
            		wantWidth = bitMapWidth;
            		wantHeight = bitMapHeight;
            	}
            	
            	Bitmap bitmapCutPart = null;//切割部分
            	Matrix matrix=new Matrix(); 
            	
            	if(bitMapWidth*1.0/bitMapHeight > wantWidth*1.0/wantHeight ) 
            	{
            		int theWidthCut =  (int)(wantWidth*1.0/wantHeight * bitMapHeight);
            		matrix.postScale(wantHeight*1.0f/bitMapHeight,wantHeight*1.0f/bitMapHeight);             		
            		Log.d("sss","Majiang 1111111 theWidthCut="+theWidthCut );            		
            		bitmapCutPart = Bitmap.createBitmap(bitmap , (int)(bitMapWidth/2.0f-theWidthCut/2.0f) , 0 , theWidthCut , bitMapHeight,matrix,true );            		
            	}
            	else
            	{
            		matrix.postScale(wantWidth*1.0f/bitMapWidth,wantWidth*1.0f/bitMapWidth); 
            		int theHeightCut =  (int)(bitMapWidth*1.0 / (wantWidth*1.0/wantHeight));
            		Log.d("sss","Majiang 22222 theHeightCut="+theHeightCut );
            		bitmapCutPart = Bitmap.createBitmap(bitmap , 0 , (int)(bitMapHeight/2- theHeightCut/2), bitMapWidth , theHeightCut,matrix,true );
            	}
            	
            	
                    out = new FileOutputStream(file);
                    if(bitmapCutPart.compress(Bitmap.CompressFormat.JPEG, 70, out)) 
                    {
                            out.flush();
                            out.close();
                    }
                  
                    bitmapCutPart.recycle();
                    bitmapCutPart = null;
                    
                    return true;
            } 
            catch (FileNotFoundException e) 
            {
                    e.printStackTrace();
            } 
            catch (IOException e) 
            {
                    e.printStackTrace(); 
            }
            return false;
    }
    
    public void Local_Choose_File_Start(JSONObject prms) 
	{
		m_imagePickerJson = prms;
		
		final CharSequence[] items = { "相册", "拍照" };
		AlertDialog dlg = new AlertDialog.Builder(this).setTitle("选择图片").setItems(items,
		new DialogInterface.OnClickListener() {
		public void onClick(DialogInterface dialog,int item) {
			//这里item是根据选择的方式,	在items数组里面定义了两种方式,拍照的下标为95166所以就调用拍照方法	
			if(item==1){ 
//						Intent getImageByCamera= new Intent("android.media.action.IMAGE_CAPTURE");   
					    Uri	mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),  
                        "tmp_contact_" + ".jpg"));  
					    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
						if(mImageCaptureUri != null)
						{							
							intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,mImageCaptureUri);	
						}
						  
						intent.putExtra("return-data", true);  
						startActivityForResult(intent, 95166);   						
					}else{
						Intent getImage = new Intent(Intent.ACTION_GET_CONTENT); 
				        getImage.addCategory(Intent.CATEGORY_OPENABLE); 
				        getImage.setType("image/jpeg"); 
				        startActivityForResult(getImage, 95165); 
					}
				}
			}).create();
		dlg.setOnCancelListener(
				new OnCancelListener(){
					@Override
					public void onCancel(DialogInterface arg0) {
						// TODO Auto-generated method stub
						Log.d("on cancel listener", "on cancel listernner");
						try {
							m_imagePickerJson.put("error", "1");
						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						AndroidNDKHelper.SendMessageWithParameters("Local_Choose_File_Result", m_imagePickerJson);
						m_imagePickerJson = null;

					}			
		});
		
		dlg.show();
	}

    @Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		
		if(m_imagePickerJson != null && (requestCode == Activity_Tag_ChoosePhoto
				|| requestCode == Activity_Tag_TakePhoto || requestCode == Activity_Tag_CropPhoto ))
		{
			if(resultCode != Activity.RESULT_OK )
			{
				try {
					m_imagePickerJson.put("error", "1");
				} catch (Exception e1) {
					e1.printStackTrace();
				}
				AndroidNDKHelper.SendMessageWithParameters("Local_Choose_File_Result", m_imagePickerJson);
				m_imagePickerJson = null;
				return;
			}

			
			//选图
			Bitmap myBitmap = null;
			byte[] mContent;
			ContentResolver resolver = getContentResolver(); 
			String fileTempSave = "";
			try {
				fileTempSave = m_imagePickerJson.getString("temp_save_image_path");
			} catch (Exception e) {
				e.printStackTrace();
			}
		
			if(requestCode ==Activity_Tag_TakePhoto )
			{
		        Uri mImageCaptureUri = Uri.fromFile(new File(fileTempSave));
		        Uri moriginUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),  
                        "tmp_contact_" + ".jpg"));
		        
	            CropImageIntentBuilder cropImage = new CropImageIntentBuilder(512, 512, mImageCaptureUri);
	            cropImage.setSourceImage(moriginUri);

	            startActivityForResult(cropImage.getIntent(this) , Activity_Tag_CropPhoto);
	            //startActivity(cropImage.getIntent(this) );
				return;
			}
			else if( requestCode == Activity_Tag_ChoosePhoto)
			{
				Uri mImageCaptureUri = Uri.fromFile(new File(fileTempSave));
		        
                CropImageIntentBuilder cropImage = new CropImageIntentBuilder(512, 512, mImageCaptureUri);
	            cropImage.setSourceImage(data.getData());

	            startActivityForResult(cropImage.getIntent(this) , Activity_Tag_CropPhoto);
	            return;
			}
			else if (requestCode == Activity_Tag_ChoosePhoto) { 
	            try { 
	            	//获得图片的uri 
	            	Bundle bdl =  data.getExtras();
	                Uri originalUri = data.getData(); 
	                if(originalUri != null)
	                {	                	
		                //将图片内容解析成字节数组 
		                mContent=readStream(resolver.openInputStream(Uri.parse(originalUri.toString())));
		                
		                BitmapFactory.Options options = new BitmapFactory.Options();
		                
		                //将字节数组转换为ImageView可调用的Bitmap对象 
		                myBitmap = getPicFromBytes(mContent, null); 
		                ////把得到的图片绑定在控件上显示
		                //imageView.setImageBitmap(myBitmap);
		                this.saveBitmap(myBitmap, fileTempSave);//保存为临时文件	                	
		                myBitmap.recycle();
		                myBitmap = null;
		                
		                m_imagePickerJson.put("success", "1");
	                }
	                else
	                {	                	
	                	m_imagePickerJson.put("error", "1");
	                }
	                
	                
	                
	            } catch (Exception e) { 
	            	try {
						m_imagePickerJson.put("error", "1");
					} catch (Exception e1) {
						e1.printStackTrace();
					}
	                System.out.println(e.getMessage()); 
	                
	            } 

	        }else if(requestCode ==Activity_Tag_TakePhoto){
	        	try {
		        
	        		String sdStatus = Environment.getExternalStorageState(); 
	                if(sdStatus.equals(Environment.MEDIA_MOUNTED))  
	                {  	                	
	                    try {  
	                        try {  
	                        	 Uri mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),  
		                                 "tmp_contact_" + ".jpg"));  
	                            // 将图片内容解析成字节数组  
	                            mContent = readStream(resolver.openInputStream(Uri.parse(mImageCaptureUri.toString())));  
	                            // 将字节数组转换为ImageView可调用的Bitmap对象  
	                            myBitmap = getPicFromBytes(mContent, null);  
	                            //把得到的图片绑定在控件上显示  
	                            
	                            this.saveBitmap(myBitmap, fileTempSave);//保存为临时文件
	    						myBitmap.recycle();
	    		                myBitmap = null;
	    		                mContent = null;
	                            
	                        } catch (FileNotFoundException e) {  
	                            e.printStackTrace();  
	                        }  
	                    } catch (Exception e) {  
	                    }  
		        		
	                }  
	                else
	                {
	                	//读出来的缩略图
	                	Bundle extras = data.getExtras();
				    	myBitmap = (Bitmap) extras.get("data");
						
						//把得到的图片绑定在控件上显示
						//imageView.setImageBitmap(myBitmap);
						this.saveBitmap(myBitmap, fileTempSave);//保存为临时文件
						myBitmap.recycle();
		                myBitmap = null;
	                }
	                
					m_imagePickerJson.put("success", "1");
					
				} catch (Exception e) {
					try {
						m_imagePickerJson.put("error", "1");
					} catch (Exception e1) {
						e1.printStackTrace();
					}
					e.printStackTrace();
				}
				
				
	        }
	        else if(requestCode == Activity_Tag_CropPhoto )
	        {
	        	try { 
	            	//获得图片的uri 
//	            	Bundle bdl =  data.getExtras();
//	                Uri originalUri = data.getData(); 
//	                Uri mImageCaptureUri = Uri.fromFile(new File(fileTempSave));
//	                
//	                if(originalUri != null)
//	                {	                	
//		                //将图片内容解析成字节数组 
//		                mContent=readStream(resolver.openInputStream(Uri.parse(originalUri.toString())));
//		                
//		                BitmapFactory.Options options = new BitmapFactory.Options();
//		                
//		                //将字节数组转换为ImageView可调用的Bitmap对象 
//		                myBitmap = getPicFromBytes(mContent, null); 
//		                ////把得到的图片绑定在控件上显示
//		                //imageView.setImageBitmap(myBitmap);
//		                this.saveBitmap(myBitmap, fileTempSave);//保存为临时文件	                	
//		                myBitmap.recycle();
//		                myBitmap = null;
//		                
//		                m_imagePickerJson.put("success", "1");
//	                }
//	                else
//	                {	                	
//	                	m_imagePickerJson.put("error", "1");
//	                }
//	                
	        		m_imagePickerJson.put("success", "1");
	                
	            } catch (Exception e) { 
	            	try {
						m_imagePickerJson.put("error", "1");
					} catch (Exception e1) {
						e1.printStackTrace();
					}
	                System.out.println(e.getMessage()); 
	                
	            } 
	        	
	        	AndroidNDKHelper.SendMessageWithParameters("Local_Choose_File_Result", m_imagePickerJson);
				m_imagePickerJson = null;
	        }	
			
			
			return;
		}
		
		
		
		if (mBalinShareManager != null) {
			mBalinShareManager = new BalinShareManager(this);
		}
		mBalinShareManager.addSSO(requestCode, resultCode, data);

	}




你可能感兴趣的:(android 剪切照片/相册,不依赖厂商API方案)