【移動應用開發(fā)技術】android中怎么通過自定義Camera實現(xiàn)拍照_第1頁
【移動應用開發(fā)技術】android中怎么通過自定義Camera實現(xiàn)拍照_第2頁
【移動應用開發(fā)技術】android中怎么通過自定義Camera實現(xiàn)拍照_第3頁
【移動應用開發(fā)技術】android中怎么通過自定義Camera實現(xiàn)拍照_第4頁
【移動應用開發(fā)技術】android中怎么通過自定義Camera實現(xiàn)拍照_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術】android中怎么通過自定義Camera實現(xiàn)拍照

android中怎么通過自定義Camera實現(xiàn)拍照,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面在下將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。1、打開相機a.預覽拍攝圖片,需用到SurfaceView,并且實現(xiàn)其回調函數(shù)implementsSurfaceHolder.Callback;activity_camera.xml<?xml

version="1.0"

encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>

<SurfaceView

android:id="@+id/sv"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

/>

<Button

android:id="@+id/btn_camera"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="拍照"

/>

</LinearLayout>2、獲取相機并開啟預覽/**

*

獲取系統(tǒng)相機

*

*

@return

*/

private

Camera

getcCamera()

{

Camera

camera

=

null;

try

{

camera

=

Camera.open();

}

catch

(Exception

e)

{

camera

=

null;

}

return

camera;

}/**

*

顯示相機預覽圖片

*

*

@return

*/

private

void

showCameraView(Camera

camera,SurfaceHolder

holder)

{

try

{

camera.setPreviewDisplay(holder);

camera.setDisplayOrientation(90);

camera.startPreview();

}catch

(Exception

e){

e.printStackTrace();

};

}/**

**

實現(xiàn)界面回調處理

*/

@Override

public

void

surfaceCreated(SurfaceHolder

holder)

{

showCameraView(mCamera,

holder);

}

@Override

public

void

surfaceChanged(SurfaceHolder

holder,

int

format,

int

width,

int

height)

{

mCamera.stopPreview();

showCameraView(mCamera,

holder);

}

@Override

public

void

surfaceDestroyed(SurfaceHolder

holder)

{

clearCamera();

}

}3、相機主頁面處理public

class

CameraActivity

extends

AppCompatActivity

implements

SurfaceHolder.Callback{

private

SurfaceView

sv;

private

Camera

mCamera;

private

SurfaceHolder

holder;

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_camera);

sv

=

(SurfaceView)findViewById(R.id.sv);

holder

=

sv.getHolder();

holder.addCallback(this);

findViewById(R.id.btn_camera).setOnClickListener(new

View.OnClickListener()

{

@Override

public

void

onClick(View

v)

{

//

獲取當前相機參數(shù)

Camera.Parameters

parameters

=

mCamera.getParameters();

//

設置相片格式

parameters.setPictureFormat(ImageFormat.JPEG);

//

設置預覽大小

parameters.setPreviewSize(800,

480);

//

設置對焦方式,這里設置自動對焦

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

mCamera.autoFocus(new

Camera.AutoFocusCallback()

{

@Override

public

void

onAutoFocus(boolean

success,

Camera

camera)

{

//

判斷是否對焦成功

if

(success)

{

//

拍照

第三個參數(shù)為拍照回調

mCamera.takePicture(null,

null,

new

Camera.PictureCallback()

{

@Override

public

void

onPictureTaken(byte[]

data,

Camera

camera)

{

//

data為完整數(shù)據(jù)

File

file

=

new

File("/sdcard/photo.png");

//

使用流進行讀寫

try

{

FileOutputStream

fos

=

new

FileOutputStream(file);

try

{

fos.write(data);

//

關閉流

fos.close();

//

查看圖片

Intent

intent

=

new

Intent();

//

傳遞路徑

intent.putExtra("path",

file.getAbsolutePath());

setResult(0,intent);

finish();

}

catch

(IOException

e)

{

//

TODO

Auto-generated

catch

block

e.printStackTrace();

}

}

catch

(FileNotFoundException

e)

{

//

TODO

Auto-generated

catch

block

e.printStackTrace();

}

}

});

}

}

});

}

});

}

@Override

protected

void

onResume()

{

super.onResume();

if

(mCamera

==

null)

{

mCamera

=

getCamera();

if

(holder

!=

null)

{

showCameraView(mCamera,

holder);

}

}

}

@Override

protected

void

onPause()

{

//

TODO

Auto-generated

method

stub

super.onPause();

//

activity暫停時我們釋放相機內存

clearCamera();

}

@Override

protected

void

onDestroy()

{

super.onDestroy();

}

/**

*

釋放相機的內存

*/

private

void

clearCamera()

{

//

釋放hold資源

if

(mCamera

!=

null)

{

//

停止預覽

mCamera.stopPreview();

mCamera.setPreviewCallback(null);

//

釋放相機資源

mCamera.release();

mCamera

=

null;

}

}4、啟動activity(設置拍照完圖片路徑返回顯示圖片處理,一定要對圖片進行采樣率操作(很可能拍照的圖片太多而無法顯示,又不報任何異常))public

class

MainActivity

extends

AppCompatActivity

{

private

ImageView

cameraIv;

@Override

protected

void

onActivityResult(int

requestCode,

int

resultCode,

Intent

data)

{

if(resultCode

==

0

&&

requestCode

==

100)

{

String

path

=

data.getStringExtra("path");

BitmapFactory.Options

options

=

new

BitmapFactory.Options();

options.inJustDecodeBounds

=

true;

BitmapFactory.decodeFile(path,

options);

ImageSize

imageSize

=

getImageViewSize(cameraIv);

options.inSampleSize

=

caculateInSampleSize(options,

imageSize.width,

imageSize.height);

//

使用獲得到的InSampleSize再次解析圖片

options.inJustDecodeBounds

=

false;

Bitmap

bitmap

=

BitmapFactory.decodeFile(path,

options);

cameraIv.setImageBitmap(bitmap);

}

super.onActivityResult(requestCode,

resultCode,

data);

}

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button

openButton

=

(Button)

findViewById(R.id.button);

cameraIv

=

(ImageView)

findViewById(R.id.imageView);

openButton.setOnClickListener(new

View.OnClickListener()

{

@Override

public

void

onClick(View

v)

{

Intent

intent

=

new

Intent(MainActivity.this,CameraActivity.class);

startActivityForResult(intent,100);

}

});

}

/*

根據(jù)需求的寬和高以及圖片實際的寬和高計算SampleSize

*

*

@param

options

*

@param

width

*

@param

height

*

@return

*/

public

static

int

caculateInSampleSize(BitmapFactory.Options

options,

int

reqWidth,

int

reqHeight)

{

int

width

=

options.outWidth;

int

height

=

options.outHeight;

int

inSampleSize

=

1;

if

(width

>

reqWidth

||

height

>

reqHeight)

{

int

widthRadio

=

Math.round(width

*

1.0f

/

reqWidth);

int

heightRadio

=

Math.round(height

*

1.0f

/

reqHeight);

inSampleSize

=

Math.max(widthRadio,

heightRadio);

}

return

inSampleSize;

}

public

static

ImageSize

getImageViewSize(ImageView

imageView)

{

ImageSize

imageSize

=

new

ImageSize();

DisplayMetrics

displayMetrics

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論