2011年12月31日土曜日

PictureSize and format

Change picture format and size at Camera Class
get current picture format .
Camera.Parameters param = camera.getParameters();
Log.d("camera", "format= " + param.getPictureFormat ());
get supported picture format list.
Camera.Parameters param = camera.getParameters();
List pictureformatlist = param.getSupportedPictureFormats ();
for (int i=0;i < pictureformatlist.size();i++) {
 Log.d("camera", "format " + i + " = " + pictureformatlist.get(i));
}
NexusOne is suppoerted 256(JPEG) only.
get current picture size.
//get
Camera.Parameters param = camera.getParameters();
//get picture size
Log.d("camera", "width= " + param.getPictureSize ().width + " height= " + param.getPictureSize ().height);
get supported picture size list.
Camera.Parameters param = camera.getParameters();
List picturesizelist = param.getSupportedPictureSizes ();
for (int i=0;i < picturesizelist.size();i++) {
 Log.d("camera", i + " width = " + picturesizelist.get(i).width + " height = "  + picturesizelist.get(i).height);
}
NexusOne is supported list:
width = 2592 height = 1944
width = 2048 height = 1536
width = 1600 height = 1200
width = 1024 height = 768
width = 512 height = 384
set picture size. change taken picture image size.
Camera.Parameters param = camera.getParameters();
param.setPictureSize(2048, 1536);
camera.setParameters(param);

source code is here.

GridView From SDCard Video

I tryed GridView. It was made from SD Card Video Clip.

I created class at extends BaseAdatpter.
Override getCount(), getItem(), getItemId(), getView().
getView() is creating ImageView from video clip.
getCount() return is SDCard Video Clip Number
public int getCount() {
 Cursor c = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null,null);
 return c.getCount();
}

getItem() is no use.
public Object getItem(int arg0) {
 return null;
}
getItemId() is no use.
public long getItemId(int position) {
 return 0;
}
This is getView()..

I create Cursor and move position.
Cursor c = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null,null);
c.moveToPosition(position);
check file path.
int dataIndex = c.getColumnIndex(MediaStore.Video.Media.DATA);
String path = c.getString(dataIndex);
get thumbnail bitmap.
Bitmap bmp = ThumbnailUtils.createVideoThumbnail(path,MediaStore.Video.Thumbnails.MINI_KIND );
setView.
imageView.setImageBitmap(bmp);
view set adapter extends BaseAdapter.
mGridView = (GridView)findViewById(R.id.gridView1);
mGridView.setAdapter(new ImageAdapter());
source code is here.

getPreviewSize getPreviewFormat

check Camera class getPreviewFormat() API.
get now setting and supported list.
Camera.Parameters param = camera.getParameters();
//get preview format
Log.d("camera", "PreviewFormat=" + param.getPreviewFormat());
//get preview supported format
List< Integer > previewformatlist = param.getSupportedPreviewFormats ();
for (int i=0;i < previewformatlist.size();i++) {
 Log.d("camera", i + " format = " + previewformatlist.get(i));
}
NexusOne is supported NV21 only.
check Camera class getPreviewSize() API.
get now setting and supported list.
//get
Camera.Parameters param = camera.getParameters();
//get preview size
Log.d("camera", "PreviewSize width=" + param.getPreviewSize().width + " heigth=" + param.getPreviewSize().height);
//get preview supported size
List< Camera.Size > previewsizelist = param.getSupportedPreviewSizes ();
for (int i=0;i < previewsizelist.size();i++) {
 Log.d("camera", i + " size width = " + previewsizelist.get(i).width + " height = " + previewsizelist.get(i).height);
}
They are supported list at NexusOne.
 0 size width = 1280 height = 720
 1 size width = 800 height = 480
 2 size width = 720 height = 480
 3 size width = 640 height = 480
 4 size width = 576 height = 432
 5 size width = 480 height = 320
 6 size width = 384 height = 288
 7 size width = 352 height = 288
 8 size width = 320 height = 240
 9 size width = 240 height = 160
 10 size width = 176 height = 144

Source code is here.

setPreviewFpsRange

Check Camera Class getPreviewFPS() API. NexusOne is supported one pair only.
Check PreviewPFS now.
Camera.Parameters param = camera.getParameters();
int[] fpsrange = new int[2];
param.getPreviewFpsRange(fpsrange);
Log.d("camera", "min= " + fpsrange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX]);
Log.d("camera", "max= " + fpsrange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
Get supported PreviewFPS.
Camera.Parameters param = camera.getParameters();
List fpslist = param.getSupportedPreviewFpsRange();
Log.d("camera", "size= " + fpslist.size());
for (int i=0;i < fpslist.size();i++) {
 Log.d("camera", i + " fps= " + fpslist.get(i)[Camera.Parameters.PREVIEW_FPS_MIN_INDEX]);
 Log.d("camera", i + " fps= " + fpslist.get(i)[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
}
NexusOne supported value is Max = 26620 and Min 9831.
set PreviewFPS.I think Max and Min combination is getSupportedPreviewFpsRange() result only, if other do exception.
Camera.Parameters param = camera.getParameters();
param.setPreviewFpsRange(9831, 26620);
camera.setParameters(param);
Source code is here.

setSceneMode

Check Scene. But My NexusOne is not suppoert SceneMode.
getSceneMode() = null. This article is just information.

Check SceneMode now.
Camera.Parameters param = camera.getParameters();
Log.d("camera", "now = " + param.getSceneMode ());
Check supported SceceMode.

Camera.Parameters param = camera.getParameters();
List< String > modelist = param.getSupportedSceneModes ();

for (int i=0;i < modelist.size();i++) {
 Log.d("camera", "type= " + modelist.get(i));
}
Set ScenceMode.
Camera.Parameters param = camera.getParameters();
param.setSceneMode(modelist.get(mode_counter));
camera.setParameters(param);
Source code is here.

ActivityInstrumentationTestCase2 sendPointerSync

I try sendPointerSync() API over surfaceView.
First, Target Activity Code:
layout file is main.xml ....


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


ActivityInstrumentationTestCase2 invokeMenuActionSync

I try menu test. I used invokeMenuActionSync().
target Activity code.
This is menu create code.
menu.add(Menu.NONE, Menu.FIRST, Menu.NONE, "1");
menu.add(Menu.NONE, Menu.FIRST + 1, Menu.NONE, "2");
This is menu pushed code.
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case Menu.FIRST:
     Log.d("test", "pushed 1");
        break;
    case Menu.FIRST + 1:
     Log.d("test", "pushed 2");
        break;
    default:
        break;
    }
    return true;
}   

This is Tester.
This is push menu and push menu button.
mInstrumentation.invokeMenuActionSync(mActivity, Menu.FIRST, 0);

Do test like here.
Logcat view follow:
pushed 1

Target Activity source code is here.
Tester source code is here.

2011年12月30日金曜日

ActivityInstrumentationTestCase2

 I try JUnit.


Target Activity.

There is only button. I check logcat whether button is pushed.
Button button = (Button)findViewById(R.id.button1);

button.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  Log.d("test", "button1");
 }
});
This is Tester. Only Button pushed.

setUp:get Activity and instrumentation.
mActivity = getActivity();
mInstrumentation = getInstrumentation();
test is button pushed. This must be no Errors.
public void testPushButton() throws Exception {
 
 final Button btnExecute = (Button)mActivity.findViewById(R.id.button1);
 
 mActivity.runOnUiThread(new Runnable() {
  public void run() {
   btnExecute.dispatchTouchEvent(MotionEvent.obtain(5,0, MotionEvent.ACTION_DOWN, 0, 0, 0));
   btnExecute.dispatchTouchEvent(MotionEvent.obtain(5,0, MotionEvent.ACTION_UP, 0, 0, 0));
   
  }
  
 });
 
 mInstrumentation.waitForIdleSync();
 
 assertEquals(true , true);
}

Test Start to select Tester 's "Android JUnit Test" like follow


It is result:



target source code is here.
Tester source code is here.

Logcat time

I thought logcat time was windows pc time.
but I found logcat time is cell phone time.



2011年12月19日月曜日

setWhiteBalance

I check setWhiteBalance() in Android.
I get WhiteBanance Parameter now.

Camera.Parameters param = camera.getParameters();
Log.d("camera", "now= " + param.getWhiteBalance ());

I print support paramter list in this machine.
Camera.Parameters param = camera.getParameters();
List< String > whitelist = param.getSupportedWhiteBalance ();
for (int i=0;i < whitelist.size();i++) {
 Log.d("camera", "type= " + whitelist.get(i));
}
This is NexusOne Paramter List.
auto
incandescent
fluorescent
daylight
cloudy-daylight


I set WhiteBalance.
param.setWhiteBalance(whitelist.get(white_mode));
camera.setParameters(param);

source code is here.

2011年12月15日木曜日

Application class

I try Application class on Android.




This is Application class. It is Saving int value.
public class TestApplication extends Application {
public class TestApp extends Application {
 private int _number = 0;
 @Override
    public void onCreate() {
  Log.d("test", "onCreate");
 }
    @Override
    public void onTerminate() {
  Log.d("test", "onTerminate");
    }
    public void setNumber(int number){
  Log.d("test", "setNumber");
     _number = number;
    }
    public int getNumber(){
  Log.d("test", "getNumber");
     return _number;
    }

}

This is Setter Activity for application class.

_testApp = (TestApp) this.getApplication();

_testApp.setNumber(8);
Log.d("test", "Number = "+ _testApp.getNumber());

And wake up getter Activity.
Intent intent = new Intent();
intent.setClass(this, TesterActivity.class);
startActivity(intent);

This is getter Activity.
_testApp = (TestApp) this.getApplication();

Log.d("test", "Tester Number = "+ _testApp.getNumber());

This application Log:
onCreate
setNumber
getNumber
Number = 8
getNumber
Tester Number = 8
I must change Android Manifest.xml
source code is here.


I reference ...


I reference android site. They are Techfirm Lab and tech Booster

Thanks very much!

tech Booster
http://techbooster.org/


Techfirm Lab
http://labs.techfirm.co.jp/android/

2011年12月13日火曜日

Try Semaphore

I check Semaphore.

It's allow sample

Semaphore sem = new Semaphore(1); //allow  only 1 member .
Log.d("test", "constructure");
sem.drainPermits(); // No permit.
Log.d("test", "drainPermits");

sem.release(); //release semaphore and 1 permit.

Log.d("test", "release");

try {
 sem.acquire(); //require permit.
} catch (InterruptedException e) {
 e.printStackTrace();
}

Log.d("test", "acquire"); //allowed
Up program log:
constructure
drainPermits
release
acquire
up program source code

2011年12月10日土曜日

addCallbackbuffer was used

I check addCallbackBuffer().
addCallbackBuffer() registers the buffer to use OnPreviewFrame(). OnPreviewFrame() was registered setPreviewCallbackWithBuffer().

First, caculate the buffer size. frame_size is the buffer size.
example. width = 800 and height = 400, PreviewFormat is NV21 , frame_size is 576000 byte.

Camera.Parameters param = _camera.getParameters();
int imgformat = param.getPreviewFormat();
int bitsperpixel = ImageFormat.getBitsPerPixel(imgformat);
int byteperpixel = bitsperpixel / 8;
Camera.Size camerasize = param.getPreviewSize();
int frame_size = ((camerasize.width * camerasize.height) * bitsperpixel) / 8;

prepare callback function. If you process video image, you use data to received by callback.

private Camera.PreviewCallback mPreviewListener = new Camera.PreviewCallback() {
 @Override
 public void onPreviewFrame(byte[] data, Camera camera) {
  Log.d("camera", "onPreviewFrame size=" + data.length);
     //outputFile(data);//ファイル取得する関数
       //_camera.addCallbackBuffer(data);//バッファを再利用する
 }
};

register callback.

_camera.setPreviewCallbackWithBuffer(mPreviewListener);


register the buffer. If register the buffer, callback function is called soon.

byte[] frame = new byte[frame_size];
_camera.addCallbackBuffer(frame);

My source code is here.

MediaPlayer seekto

I try MediaPlayer class seekTo() and preparedAsync() API.



First, I designed if touch, move 10000 msec position from clip top.
boolean isSeeking = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
 switch(event.getAction()) {
 case MotionEvent.ACTION_DOWN:
  if (isSeeking == false) {
   isSeeking = true;
   _mediaplayer.seekTo(10000);
  } else {
   //Do nothing
  }
  break;
 default:
  break;
 }
 return  super.onTouchEvent(event);
 
}
And... I had to catch seek complete event.
@Override
public void onSeekComplete(MediaPlayer mp) {
 isSeeking = false;
}
Must register seek complete listener
_mediaplayer.setOnSeekCompleteListener(this);
Second, I tryed preparedAsync(). call preparedAsync() and register prepared complete event
_mediaplayer.setOnPreparedListener(this);
_mediaplayer.setOnSeekCompleteListener(this);
_mediaplayer.prepareAsync();
This is prepared completed process:
@Override
public void onPrepared(MediaPlayer mp) {
 _mediaplayer.start();
 Log.d("player", "start");
}

My source code is here.

MediaPlayer API more and more

I used MediaPlayer class API.
getAudioSessionId(), getCurrentPosition(), and pause().
and I try any Listener interface implement.
onCompletion(), onError(), onInfo(), onVideoSizeChanged(),


  • when app  play clip, onVideoSizeChanged() is called soon.
  • when app run clip end, onCompletion() is called.
  • If setLoop(true), onCompletion() isn't call. but onInfo() is called by what = 1 and extra = 44.



I used getAudioSessionId(), getCurrentPosition().
Log.d("player", "getAudioSessionId = " + _mediaplayer.getAudioSessionId());
Log.d("player", "getCurrentPosition = " + _mediaplayer.getCurrentPosition());

I designed as if app play clip, app call pause and if app pause, app play clip.
boolean isPause = false;
・・・・
if (isPause == false) {
 isPause = true;
 _mediaplayer.pause();
} else {
 isPause = false;
 _mediaplayer.start();
}
Implements Listeners:
@Override
public void onCompletion(MediaPlayer mp) {
 Log.d("player", "onCompletion");
 
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
 Log.d("player", "onError what = " + what + "extra = " + extra);
 return false;
}
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
 Log.d("player", "onInfo what = " + what + "extra = " + extra);
 return false;
}
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
 Log.d("player", "onVideoSizeChanged width = " + width + " height = " + height);
 
}
@Override
public void onPrepared(MediaPlayer mp) {
 Log.d("player", "onPrepared");
}


Must Register listener before MediaPlayer.start():
_mediaplayer.setOnCompletionListener(this);
_mediaplayer.setOnErrorListener(this);
_mediaplayer.setOnInfoListener(this);
_mediaplayer.setOnPreparedListener(this);
_mediaplayer.setOnVideoSizeChangedListener(this);
My source code is here.

2011年12月9日金曜日

MediaPlayer API More

I used more MediaPlayer class API.
getDuration(), getVideoHeight(), getVideoWidth(), isLooping(), isPlaying().

While app not play clip, getVideoHeight() = 0 and getVideoWidth() = 0. and isPlaying() is false.
Log.d("player", "duration = " + _mediaplayer.getDuration());
Log.d("player", "getVideoHeight = " + _mediaplayer.getVideoHeight());
Log.d("player", "getVideoWidth = " + _mediaplayer.getVideoWidth());
Log.d("player", "isLooping=" + _mediaplayer.isLooping());
Log.d("player", "isPlaying=" + _mediaplayer.isPlaying());

but.. While app play clip, getVideoHeigth() = 240, getVideoWidth=320, and isPlaying=true.
Log.d("player", "getVideoHeight = " + _mediaplayer.getVideoHeight());
Log.d("player", "getVideoWidth = " + _mediaplayer.getVideoWidth());
Log.d("player", "isPlaying=" + _mediaplayer.isPlaying());
My source code is here.

GridView

I used GridView class.



Reference to google develper site

This is screen shot
My Source code here

2011年12月4日日曜日

clip player

I used MediaPlayer class.

make ready layout for playback image follow:


    



make ready surface callback follow:
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
  int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
 // TODO Auto-generated method stub
}

First I create surface view.
 _preview = (SurfaceView)findViewById(R.id.surfaceView1);
 _holder = _preview.getHolder();
 _holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 _holder.addCallback(this);

Second If surfaceCreated call, start to play clip.
String path = "/sdcard/sample.mp4";
_mediaplayer = new MediaPlayer();
try {
 _mediaplayer.setDataSource(path);
} catch (IllegalArgumentException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
} catch (IllegalStateException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
} catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}
_mediaplayer.setDisplay(holder);
try {
 _mediaplayer.prepare();
} catch (IllegalStateException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
} catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}
_mediaplayer.setOnPreparedListener(this);

Last If end prepare(), onPrepared called.
@Override
public void onPrepared(MediaPlayer mp) {
 // TODO Auto-generated method stub
 _mediaplayer.start();
}


source code here

cancelAutoFoucs

I check cancelAutoFocus API.


call autoFoucs().
_camera.autoFocus(null);

call cancelAutoFocus(). focus moves default position when call cancelAutoFocus().
_camera.cancelAutoFocus();
souce code here.

CameraInfo

I research CameraInfo API.



Get number of camera.
int numberofcamera = Camera.getNumberOfCameras();
Log.d("camera", "number = " + numberofcamera);

get CameraInfo and print the information.
for (int i = 0 ; i < numberofcamera;i++) {
 CameraInfo camerainfo = new Camera.CameraInfo();
 Camera.getCameraInfo(i, camerainfo);
 
 Log.d("camera", "facing =" + camerainfo.facing);
 Log.d("camera", "orientation =" + camerainfo.orientation);
}
My Phone NexusOne has ... Cmaera is one. facing is 0, orientation is 90.
"facing = 0" means camera is agenst screen.
I need to research orientation.

source code here

2011年11月27日日曜日

Camera lock

I had a conflict that how to use Camera.lock.
But at last I got how to use Camera.lock() API.

Camera.lock() API is....
For example, first set camera parameter, second record camera image.

Reference document here. it is  android developer site.

My source code here.

2011年11月23日水曜日

add more MediaRecorder API 2

I try setOutputFormat and setVideoEncoder.

_recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
_recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
but RAW_AMR is audio only.
_recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
_recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
_recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

try setVideoEncodingBitRate()
_recorder.setVideoEncodingBitRate(10000000);

try setVideoFrameRate()
_recorder.setVideoFrameRate(5);

setVideoSize
_recorder.setVideoSize(100, 100);
If set odd size, app comes exception.

source code here

Add more MediaRecorder API

I used MediaRecorder API follow:

setMaxDuration()
setMaxFileSize()
setOnErrorListener()
setOnInfoListener()
setOrientationHint()

callback function for max duration and max file size.
MediaRecorder.OnInfoListener mInfoListener = new MediaRecorder.OnInfoListener() {
 @Override
 public void onInfo(MediaRecorder mr, int what, int extra) {
  // TODO Auto-generated method stub
  switch (what) {
  case MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED :
   _recorder.stop();
   _recorder.reset();
   _isRecording = false;
   Log.d("camera", "stop");
   Log.d("camera", "onInfo=" +  MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED);
   break;
  case MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED :
   _recorder.stop();
   _recorder.reset();
   _isRecording = false;
   Log.d("camera", "stop");
   Log.d("camera", "onInfo=" +  MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED);
   break;
  case MediaRecorder.MEDIA_RECORDER_INFO_UNKNOWN :
   Log.d("camera", "onInfo=" +  MediaRecorder.MEDIA_RECORDER_INFO_UNKNOWN);
   break;
  }
 }
};
set max duration if duration is 30 second, call onInfo().
_recorder.setMaxDuration(30000); //max 30 seconds
set max file size if file size is 40 M bytes, call onInfo().
_recorder.setMaxFileSize(40000000); //max 40M bytes

set orientation. it change orientation at playback only.
_recorder.setOrientationHint(0);
source code here.

setDisplayOrientation

I used setDisplayOrientation().

It is exception to do setDisplayOrientation, while camera do preview.

Do it between stopPreview and startPreview
camera.stopPreview();
camera.setDisplayOrientation(result);
camera.startPreview();
There are the Reference code at Android Developer Page follow:
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();

android.hardware.Camera.getCameraInfo(cameraId, info);

int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
    case Surface.ROTATION_0: degrees = 0; break;
    case Surface.ROTATION_90: degrees = 90; break;
    case Surface.ROTATION_180: degrees = 180; break;
    case Surface.ROTATION_270: degrees = 270; break;
}

int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
    result = (info.orientation + degrees) % 360;
    result = (360 - result) % 360;  // compensate the mirror
} else {  // back-facing
    result = (info.orientation - degrees + 360) % 360;
}

Log.d("camera", "result= " + result);
camera.stopPreview();
camera.setDisplayOrientation(result);
camera.startPreview();

source code here

NexusOne AudioSource

My android is NexusOne. When I called setAudioSource(...), it became exception. oh my god.

2011年11月20日日曜日

setOneShotPreviewCallback



Once register callback, one time be done callback.

It is callback function.
private Camera.PreviewCallback mPreviewListener = new Camera.PreviewCallback() {
 @Override
 public void onPreviewFrame(byte[] data, Camera camera) {
  Log.d("camera", "onPreviewFrame size=" + data.length);
 }
};

register callback.
_camera.setOneShotPreviewCallback(mPreviewListener);

Every time you touch, you can register a function callback, we confirmed that the function is called callback.

source code here.

2011年11月19日土曜日

setPreviewCallback

I check setPreviewCallback.

It is API to receive every camera frame.

But I found callback timing no strict interval.
10-10 13:50:13.580: DEBUG/camera(684): onPreviewFrame size=230400
10-10 13:50:13.670: DEBUG/camera(684): onPreviewFrame size=230400
10-10 13:50:13.710: DEBUG/camera(684): onPreviewFrame size=230400
10-10 13:50:13.770: DEBUG/camera(684): onPreviewFrame size=230400

calback function.
private Camera.PreviewCallback mPreviewListener = new Camera.PreviewCallback() {
 @Override
 public void onPreviewFrame(byte[] data, Camera camera) {
  Log.d("camera", "onPreviewFrame size=" + data.length);
 }
};


register callback.
_camera.setPreviewCallback(mPreviewListener);

unregister callback.
_camera.setPreviewCallback(null);
source code here.

2011年11月18日金曜日

get thumbnail from video

I used ThumbnailUtils. It create thumbnail from video file.

get thumbnail
Bitmap bmp = ThumbnailUtils.createVideoThumbnail("/sdcard/sample.3gp",MediaStore.Video.Thumbnails.MINI_KIND );

And I add thumbnail to table view.
ImageView image = new ImageView(this);
image.setImageBitmap(bmp);
tablelayout.addView(image, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT));
source code here.

MediaScannerConnection

I would like to register taken video in gallery.
I used MediaScannerConnection.
Register video.
MediaScannerConnection.scanFile(this, "/sdcard/sample.3gp", "video/3gpp", null);

It is simple. it is all.
Let see your gallery.

source code here

2011年11月17日木曜日

MediaRecorder

I use MediaRecorder class.

I set up SurfaceView.
SurfaceView mySurfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
SurfaceHolder holder = mySurfaceView.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

And set up SurfaceHolder.Callback
public void surfaceCreated(SurfaceHolder holder) {
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
 _holder = holder;
}
public void surfaceDestroyed(SurfaceHolder holder) {
}

Create MediaRecorder
_recorder = new MediaRecorder();
Initialize MediaRecorder and start it.
_recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
_recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
_recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
_recorder.setOutputFile("/sdcard/sample.3gp");
_recorder.setPreviewDisplay(_holder.getSurface());
try {
 _recorder.prepare();
} catch (Exception e) {
 Log.e("test", "recorder error");
}
_recorder.start();
stop it.
_recorder.stop();
_recorder.reset();

source code here

Actually, I would like to try Camera class and Camera.lock() method. but it has exception. in my NexusOne.

2011年11月16日水曜日

getThumbnails

I used getThumbnails() to video in gallery.


Get ContentResolver
ContentResolver contentresolver = getContentResolver();
Get video content list from sdcard.
Cursor cursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
move first a pointer of video list.
cursor.moveToFirst();
Get thumbnail.
Bitmap bmp = MediaStore.Video.Thumbnails.getThumbnail(contentresolver, id, MediaStore.Video.Thumbnails.MICRO_KIND, null);

After I put Bitmap at Table view.
source code here.

2011年11月10日木曜日

FaceDetector

I use FaceDetector class.
FaceDetector class need Bitmap class.

First get Bitmap.
Bitmap bitmapimage = BitmapFactory.decodeFile("/sdcard/face.jpg");
Get FaceDetector class
FaceDetector facedetector = new FaceDetector(bitmapimage.getWidth(), bitmapimage.getHeight(), 10);
Get face analysis result.
int num = facedetector.findFaces(bitmapimage, faces);
view result
MidPoint is center coordinate of face .
Log.d("test", "confidence = " + faces[i].confidence());
Log.d("test", "eyesDistance = " + faces[i].eyesDistance());
PointF point = new PointF();
faces[i].getMidPoint(point);
Log.d("test", "MidPoint x = " + point.x + " y=" + point.y);
Log.d("test", "euler x = " + faces[i].pose(Face.EULER_X));
Log.d("test", "euler y = " + faces[i].pose(Face.EULER_Y));
Log.d("test", "euler x = " + faces[i].pose(Face.EULER_Z));

sourcecode here

2011年11月3日木曜日

ExifInterface

ExifInterface access in jpeg exif header.

Create class
ExifInterface exif = null;
exif = new ExifInterface("/sdcard/test.jpg");
exsample getting attribute
for string

Log.d("test", "FNumber=" + exif.getAttribute("FNumber"));

for int

Log.d("test", "Flash=" + exif.getAttributeInt("Flash", 0));
for double

Log.d("test", "FocalLenght=" + exif.getAttributeDouble("FocalLenght", 0));
It is possible to get thumbnail

if (exif.hasThumbnail()) {
 outputFile(exif.getThumbnail());
}
source code here

2011年11月1日火曜日

CameraProfile

CameraProfile class give me quality parameter for jpeg encoder.

 get quality for High
int quality  = CameraProfile.getJpegEncodingQualityParameter(CameraProfile.QUALITY_HIGH);
Log.d("test", "QUALITY_HIGH=" + quality);
for medium
quality  = CameraProfile.getJpegEncodingQualityParameter(CameraProfile.QUALITY_MEDIUM);
Log.d("test", "QUALITY_MEDIUM=" + quality);
for low
quality  = CameraProfile.getJpegEncodingQualityParameter(CameraProfile.QUALITY_LOW);
Log.d("test", "QUALITY_LOW=" + quality);
source code here

my android result
QUALITY_HIGH=90
QUALITY_MEDIUM=80
QUALITY_LOW=70
This quality paramter is used for setJpegQuality().
setJpegQuality() sample source code

CamcorderProfile

I used CamcorderProfile.

Get profile.
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
View parameter,
Log.d("test","quality= " +  profile.quality);
Log.d("test","autoBitRate= " +  profile.audioBitRate);
Log.d("test","audioChannels= " +  profile.audioChannels);
Log.d("test","audioCodec= " +  profile.audioCodec);
Log.d("test","audioSampleRate= " +  profile.audioSampleRate);
Log.d("test","duration= " +  profile.duration);
Log.d("test","fileformat= " +  profile.fileFormat);
Log.d("test","videoBitRate= " +  profile.videoBitRate);
Log.d("test","videocodec= " +  profile.videoCodec);
Log.d("test","videoFrameHeight= " +  profile.videoFrameHeight);
Log.d("test","videoFrameRate= " +  profile.videoFrameRate);
Log.d("test","videoFrameWidth= " +  profile.videoFrameWidth);
The Version is Android 2.3.1. CamcorderProfile has QUALITY_HIGH and QUALITY_LOW. I don't know how to get other profile. My android result follow QUALITY_HIGH
quality= 1
autoBitRate= 96000
audioChannels= 1
audioCodec= 3
audioSampleRate= 16000
duration= 60
fileformat= 2
videoBitRate= 3000000
videocodec= 2
videoFrameHeight= 480
videoFrameRate= 27
videoFrameWidth= 720
QUALITY_LOW
quality= 0
autoBitRate= 12200
audioChannels= 1
audioCodec= 1
audioSampleRate= 8000
duration= 30
fileformat= 1
videoBitRate= 256000
videocodec= 3
videoFrameHeight= 144
videoFrameRate= 27
videoFrameWidth= 176
source code here

2011年10月18日火曜日

Magnetic

I would like to the Magnetic Sensor, but no changed the sensor at NexusOne.
If I run anywhere, the sensor change ?

I tried source code bellow:

Get SensorManeger:
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

Get Sensor:
mMagnetic = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

Implement SensorEventListener:
public class MagneticActivity extends Activity   implements SensorEventListener{
@Override
public void onSensorChanged(SensorEvent event) {
 Log.d("test", "onSensorChanged:" + event.timestamp + ":" + "x=" + event.values[0] + "y=" + event.values[1] + "z=" + event.values[2]);
}
  
source code here  





Accelerometer

Get SensorManeger:
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

Get Acceleromter Sensor:
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

Register Listener and must be unregister
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);

Implement SensorEventListener and Print sensor value
public class AccelerometerActivity extends Activity  implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
 Log.d("test", "onSensorChanged:" + event.timestamp + ":" + "x=" + event.values[0] + "y=" + event.values[1] + "z=" + event.values[2]);
}    
source code here
#include 

int main()
   printf("hello");
}

2011年10月17日月曜日

getSensorList

I checked Sensor.

Get SensorManager:
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

Get Sensor list:
List< sensor> sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);

Print sensor list:
for( Sensor s : sensorList) {
 Log.d("sensor", "Name=" + s.getName());
 Log.d("sensor", "Vendor=" + s.getVendor());
 Log.d("sensor", "Version=" + s.getVersion());
 Log.d("sensor", "MaximumRange=" + s.getMaximumRange());
 Log.d("sensor", "MinDelay=" + s.getMinDelay());
 Log.d("sensor", "Power=" + s.getPower());
 Log.d("sensor", "Type=" + s.getType());
}
the Nexus One result:

Name=BMA150 3-axis Accelerometer
Vendor=Bosh
Version=1
MaximumRange=39.24
MinDelay=0
Power=0.2
Type=1
Name=AK8973 3-axis Magnetic field sensor
Vendor=Asahi Kasei
Version=1
MaximumRange=2000.0
MinDelay=0
Power=6.8
Type=2
Name=AK8973 Orientation sensor
Vendor=Asahi Kasei
Version=1
MaximumRange=360.0
MinDelay=0
Power=7.0
Type=3
Name=CM3602 Proximity sensor
Vendor=Capella Microsystems
Version=1
MaximumRange=9.0
MinDelay=0
Power=0.5
Type=8
Name=CM3602 Light sensor
Vendor=Capella Microsystems
Version=1
MaximumRange=10240.0
MinDelay=0
Power=0.5
Type=5
Name=Gravity Sensor
Vendor=Google Inc.
Version=1
MaximumRange=39.24
MinDelay=0
Power=0.2
Type=9
Name=Linear Acceleration Sensor
Vendor=Google Inc.
Version=1
MaximumRange=39.24
MinDelay=0
Power=0.2
Type=10
Name=Rotation Vector Sensor
Vendor=Google Inc.
Version=1
MaximumRange=1.0
MinDelay=0
Power=7.0
Type=11
Source Code here