u3d 呼叫android相機和相簿裁剪成圓形

weixin_30639719發表於2020-04-05

第一步 寫方法呼叫相機相簿

現在u3d中寫好呼叫相機和相簿的方法(呼叫的同一個方法,“xj”這個是用來區分呼叫的型別的,path是你要存放的路徑)

path = Application.persistentDataPath   Application.persistentDataPath這個路徑是用來存放一些臨時資料的

 第二步 android 呼叫相機

public void TakePhoto(String arg,String path){
		 path1=path;	
		 if(arg.equals("xj"))
			{
			 if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N){

				  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
	              intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.png")));
	              startActivityForResult(intent, PHOTOHRAPH);
			 } else{
				 
				  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);				 
				 // File imagePath = new File(mContext.getFilesDir(), "camera_photos");
				  File imagePath = new File(Environment.getExternalStorageDirectory(), "temp.png");				 			
				  Uri uri = FileProvider.getUriForFile(mContext,"com.elfgame.superpoker.fileprovider",imagePath);
				  HeadFile=imagePath;
				  Log.i(uri.toString(), "頭像111111");
				  intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
				  intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION );
				  startActivityForResult(intent, PHOTOHRAPH);
			 }
			}else
			{
			       Intent intent = new Intent(Intent.ACTION_PICK, null);
	               intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
	               startActivityForResult(intent, PHOTOZOOM);
			}        
	}

  如果你的手機是android 7.0 以上的就必須這麼處理。(這個自行百度,處理android7.0許可權)

第三步  處理拍照完成

拍照完成後會呼叫這個方法

@Override
	    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	        if (resultCode == NONE)
	            return;
	      
	        if (requestCode == PHOTOHRAPH) {
	        	Log.i("照片流程1","11111");
	        	File picture = new File(Environment.getExternalStorageDirectory(), "temp.png");
	        	if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N){
	        		
	        		startPhotoZoom(Uri.fromFile(picture));
	        	}else{	        		
					  Uri uri = FileProvider.getUriForFile(mContext,"com.elfgame.superpoker.fileprovider",picture);
					  startPhotoZoom(uri);
	        	}
	        }  
	 
	        if (data == null)
	            return;  
	 
	     
	        if (requestCode == PHOTOZOOM) {	        	
	            startPhotoZoom(data.getData());
	        }
	      
	        if (requestCode == PHOTORESOULT) {
	        	
	            Bundle extras = data.getExtras();
	            if (extras != null) {  
	 
	                Bitmap photo = extras.getParcelable("data");
	                photo =getRoundedCornerBitmap(photo);
			        //imageView.setImageBitmap(photo);  
	             
	            	try {
	            		SaveBitmap(photo);
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
	            }  
	 
	        }  
	 
	        super.onActivityResult(requestCode, resultCode, data);
	    }  
	 public void startPhotoZoom(Uri uri) {
	        Intent intent = new Intent("com.android.camera.action.CROP");	
	        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);	       
	        intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
	        intent.putExtra("crop", "true");
	        intent.putExtra("scale", true);	      
	        intent.putExtra("aspectX", 1);
	        intent.putExtra("aspectY", 1);	       
	        intent.putExtra("outputX", 80);
	        intent.putExtra("outputY", 80);
	        intent.putExtra("return-data", true);
	        Log.e("1111", "11111111path");
	        startActivityForResult(intent, PHOTORESOULT);
	    }  

  把圖片處理成圓形(如果不需要可以忽略這一步)

public  Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
		if (bitmap== null){
			return null;
		}
		
		Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
		Canvas canvas = new Canvas(output);
		final Paint paint = new Paint();
		/* 去鋸齒 */
		paint.setAntiAlias(true);
		paint.setFilterBitmap(true);
		paint.setDither(true);
		// 保證是方形,並且從中心畫
		int width = bitmap.getWidth();
		int height = bitmap.getHeight();
		int w;
		int deltaX = 0;
		int deltaY = 0;
		if (width <= height) {
		w = width;
		deltaY = height - w;
		} else {
		w = height;
		deltaX = width - w;
		}
		final Rect rect = new Rect(deltaX, deltaY, w, w);
		final RectF rectF = new RectF(rect);
		 
		paint.setAntiAlias(true);
		canvas.drawARGB(0, 0, 0, 0);
		// 圓形,所有隻用一個
		int radius = (int) (Math.sqrt(w * w * 2.0d) / 2);
		canvas.drawRoundRect(rectF, radius, radius, paint);
		paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
		canvas.drawBitmap(bitmap, rect, rect, paint);
		return output;
		}

  儲存圖片並返回u3d

public void SaveBitmap(Bitmap bitmap) throws IOException {	 
			FileOutputStream fOut = null;
			String path = path1;
			Log.e(path, "11111111path");
			try {			  
				  File destDir = new File(path);
				  if (!destDir.exists())
				  {
	 
					  destDir.mkdirs();
	 
				  }
	 
				fOut = new FileOutputStream(path + "/" + FILE_NAME) ;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			
			bitmap.compress(Bitmap.CompressFormat.PNG, 50, fOut);			
			try {
				fOut.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				fOut.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			Log.e(path + "/" + FILE_NAME, "33333333path");
		
			
			mUnityPlayer.UnitySendMessage("Main","GetPho",FILE_NAME);
			Log.e(path, "44444444path");
		}

  

轉載於:https://www.cnblogs.com/zhushuangmei/p/8443912.html

相關文章