마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

기본카메라 기능에 색상반전을 시키고싶습니다.

0 추천


	// 절대경로 표시하기위한 것.  private String sdcard = Environment.getExternalStorageDirectory().getAbsolutePath();
	private String mFileimageRoute = Environment.getExternalStorageDirectory().getAbsolutePath();
	
	Button button1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		button1 = (Button) findViewById(R.id.shot_picture);
		button1.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				Toast.makeText(getApplicationContext(), "사진첩을 엽니다", 0).show();
				Intent mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://media/internal/images/media"));
				startActivity(mIntent);
			}
		});
		mPreview = (Preview) findViewById(R.id.camera_preview);
		mImageData = new byte[6][];
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {

		if (event.getAction() == MotionEvent.ACTION_DOWN) {
		if (mPreview.mCamera != null) {
			mPreview.mCamera.takePicture(mShutterCallback, mPictureCallbackRaw,
					mPictureCallbackJpeg);
		}
		}

		return false;
	}


	@Override
	protected void onDestroy() {
		if (mPreview != null) {
			Log.e("onDestroy", "onDestroy...");

			if (mPreview.mCamera != null) {
				mPreview.mCamera.stopPreview();
				mPreview.mCamera.release();
				mPreview.mCamera = null;
			}
		}
		super.onDestroy();
	}

		private int getPreFileName() {
		if (sPrefs == null) {
			sPrefs = getSharedPreferences(KEY_POPUP_ENV, Context.MODE_PRIVATE);
		}
		mFileNameYear = sPrefs.getInt(SAVE_FILE_YEAR, 0);
		mFileNameMonth = sPrefs.getInt(SAVE_FILE_MONTH, 0);
		mFileNameDay = sPrefs.getInt(SAVE_FILE_DATE, 0);
		mFileNameCount = sPrefs.getInt(SAVE_FILE_COUNT, 0);
		return mFileNameCount;
	}

	private String getRealFileName() {
		MakeFileName_Demo();
		return mFilename;
	}

	private void MakeFileName_Demo() {
		DecimalFormat decimalFormat = new DecimalFormat("00");
		DecimalFormat NumFormat = new DecimalFormat("0000");
		Calendar rightNow = Calendar.getInstance();
		int year = rightNow.get(Calendar.YEAR) % 100;
		int month = rightNow.get(Calendar.MONTH);
		int date = rightNow.get(Calendar.DATE);
		int num = getPreFileName();
		String result =decimalFormat.format(month) + decimalFormat.format(date);
		
		String FormatNum = NumFormat.format(num);
		mFilename = result + "_" + FormatNum;


		File[] files = new File("content://media/internal/images/media").listFiles();

		if (files.length == 0) {
			num++;
		} else if (files.length > 0) {

			if (CompareDate(year, month, date) == true) {
				num++;
			} else if (CompareDate(year, month, date) == false) {
		
				num = 0;
			}
		}

		SaveFileName(year, month, date, num);// xml에 저장
	}

	private boolean CompareDate(int year, int month, int date) {
		boolean ret = false;

		if (year == getFileNameYear()) {
			if (month == getFileNameMonth()) {
				if (date == getFileNameDay()) {
					ret = true;
				}
			}
		}

		return ret;
	}

	private int getFileNameYear() {
		return mFileNameYear;
	}

	private int getFileNameMonth() {
		return mFileNameMonth;
	}

	private int getFileNameDay() {
		return mFileNameDay;
	}


	private void SaveFileName(int year, int month, int date, int num) {
		// XML에 저장 putInt...
		SharedPreferences.Editor editor = sPrefs.edit();
		// putInt(값을 받을 환경변수 , 값을 얻어오는 인자값)
		editor.putInt(SAVE_FILE_YEAR, year);
		editor.putInt(SAVE_FILE_MONTH, month);
		editor.putInt(SAVE_FILE_DATE, date);
		editor.putInt(SAVE_FILE_COUNT, num);
		editor.commit();// 저장할땐 반드시 commit()을 시킨다.

	}


	public int SaveImage() {

	int ret = 0;
		

			try {
			
				FileOutputStream fileoutstream = new FileOutputStream(mFileimageRoute+getRealFileName()+".jpg");
    			   	
    			fileoutstream.write(mImageData[0]);
    			fileoutstream.close();
    			System.gc();
			}
    			catch (FileNotFoundException fne) 
            	{
            		Log.e("writing and scanning image ", fne.toString());
            		fne.printStackTrace();
            		ret = -1;
                } 
                catch (IOException ioe) 
                {
            		Log.e("writing and scanning image ", ioe.toString());
            		ioe.printStackTrace();
            		ret = -1;
            	} catch (Exception e) 
            	{
            		ret = -1;
            	}	

		return ret;

	}



	Camera.PictureCallback mPictureCallbackRaw = new Camera.PictureCallback() {

		public void onPictureTaken(byte[] data, Camera c) {
			Log.e("mPictureCallbackRaw ", "11111");

		}
	};

	Camera.PictureCallback mPictureCallbackJpeg = new Camera.PictureCallback() {

		public void onPictureTaken(byte[] data, Camera c) {
			Log.e("PictureCallback ", "11111");

			Log.e("PictureCallback ", "22222");

			mImageData[0] = data;
			
			Display defaultDisplay = ((WindowManager) getSystemService(WINDOW_SERVICE))
					.getDefaultDisplay();
			int width = defaultDisplay.getWidth();
			int height = defaultDisplay.getHeight();
			Log.e(String.valueOf(width), String.valueOf(height));
			Log.e(String.valueOf(width), String.valueOf(height));
			Log.e(String.valueOf(width), String.valueOf(height));
		
			ShowSaveDailog();

		}

	};

	Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() {
		public void onShutter() {
			Log.i(getClass().getSimpleName(), "SHUTTER CALLBACK");
		}
	};
	Camera.AutoFocusCallback cb = new Camera.AutoFocusCallback() {
		public void onAutoFocus(boolean success, Camera c) {
			Log.e("AutoFocusCallback ", "11111");

			if (success) {

				ToneGenerator tg = new ToneGenerator(
						AudioManager.STREAM_SYSTEM, 100);
				if (tg != null)
					tg.startTone(ToneGenerator.TONE_PROP_BEEP2);
				gFocussed = true;
				try {
					if (gCameraPressed) {
						if (mPreview.mCamera != null) {
							mPreview.mCamera.takePicture(mShutterCallback,
									mPictureCallbackRaw, mPictureCallbackJpeg);
						}
					}
				} catch (Exception e) {
					Log.i("Exc", e.toString());
				}
			} else {
				ToneGenerator tg = new ToneGenerator(
						AudioManager.STREAM_SYSTEM, 100);
				if (tg != null)
					tg.startTone(ToneGenerator.TONE_PROP_BEEP2);

				try {
					if (gCameraPressed) {
						if (mPreview.mCamera != null) {
							mPreview.mCamera.takePicture(mShutterCallback,
									mPictureCallbackRaw, mPictureCallbackJpeg);
						}
					}
				} catch (Exception e) {
					Log.i("Exc", e.toString());
				}
			}

		}
	};


	
	private void ShowSaveDailog() {
		
		Toast.makeText(this, "save image", Toast.LENGTH_SHORT).show();
		SaveImage();
		mImageData[0] = null;
		
		
		if (mPreview.mCamera != null) {
			// mPreview.mCamera.lock();
			try{
			mPreview.mCamera.startPreview();
			}
			catch (Exception e) {
				
			}									
		}	
	}	 
			
	}

	


이런식으로 작성되어있는 기본 카메라 어플 코드입니다. 

안드로이드 어플 개발공부를 막 시작한 사람이라서 세세히 설명 부탁드립니다 ㅠㅠ

 

테스트 기반은 맥용 이클립스 주노, AVD는 4.0.3 젤리빈으로 하고있습니다.

 

사진은 찍는것까지는 되는데 저장이 안되네요. 절대주소값이 잘못된것인지. 뭔가 코딩주소가 잘못된거같은데

 

뭐가 문제인지를 잘 모르겠네요 ㅠㅠ

 

그리고 색상을 반전시켜서 하고싶은데 어떤 코드가 들어가야 되는지 모르겠네요 찾아봐도 잘 안나오고요ㅠ

 

오토포커스 기능을 켰는데 이게 제대로 작동이되는것인지 아닌지 알수가 없어서 문제입니다.

 

안드로이드폰이 있어야 테스트 가능한건가요?

 

 

두서없이 질문드려 죄송합니다 ㅠㅠ

소지롱스타킹 (140 포인트) 님이 2013년 4월 6일 질문

1개의 답변

0 추천

FileOutputStream fileoutstream

= new FileOutputStream(new File(mFileimageRoute, getRealFileName()+".jpg"));

이렇게 한번 해보세요.

메니패스트에 외부 스토리지 쓰기 퍼미션이 있는지 확인해보시구요.

그리고 색상 반전은 안드로이드와 상관없이 이미지 프로세싱에 대해서 공부해보세요.

카메라 기능은 보통 단말기가 있어야 제대로 테스트 가능합니다.

appa (3,380 포인트) 님이 2013년 4월 8일 답변
답변 감사드립니다. 해보았으나 별 차이가 없네요.;;;

File[] files = new File("content://media/internal/images/media").listFiles();

이부분에서 문제가 있는것 아닐지;;
...