안드로이드 개발 질문/답변
(글 수 45,052)
아래의 소스를 보시면 CameraView.java 에서 카메라 구동순서를 설정해 놓았습니다. MainActivity.java의 파란글씨 부분에서 surfaceview의 화면을 캡쳐하려 하는데 까만 화면만 이미지로 저장이 되네요. 어떻게 해야 현재 화면을 그대로 캡쳐가 가능할까요?
MainActivity.java
public class MainActivity extends Activity {
private static final int MENU_EXIT = 0xCC882201;
CameraView myCamView;
SurfaceView sv;
Camera mcamera;
SurfaceHolder sh;
Thread thread;
// memory object for encoder
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
}
.
.
.
private void setup() {
clearResource();
buildResource();
Log.i("setup1", "MainActivity.java - 160");
NativeAgent.LoadLibraries();
//Log.i("setup2", "---------------------");
nativeAgt = new NativeAgent();
//Log.i("setup3", "---------------------");
cameraLoop = new StreamingLoop("teaonly.projects");
//Log.i("setup4", "---------------------");
httpLoop = new StreamingLoop("teaonly.http");
//Log.i("setup5", "---------------------");
myCamView = (CameraView)findViewById(R.id.surface_overlay);
sv = (SurfaceView)findViewById(R.id.surface_camera);
myCamView.SetupCamera(sv);
myMessage = (TextView)findViewById(R.id.label_msg);
btnStart = (Button)findViewById(R.id.btn_start);
btnStart.setOnClickListener(startAction);
//Log.i("setup6", "---------------------");
btnStart.setEnabled(true);
//Log.i("setup7", "---------------------");
RadioButton rb = (RadioButton)findViewById(R.id.res_low);
rb.setOnClickListener(low_res_listener);
rb = (RadioButton)findViewById(R.id.res_medium);
rb.setOnClickListener(medium_res_listener);
rb = (RadioButton)findViewById(R.id.res_high);
rb.setOnClickListener(high_res_listener);
//Log.i("setup8", "---------------------");
resRadios = (RadioGroup)findViewById(R.id.resolution);
View v = (View)findViewById(R.id.layout_setup);
v.setVisibility(View.VISIBLE);
//Log.i("setup9", "---------------------");
}
private void startServer() {
.
.
.
sv = myCamView.myCameraSView;
mcamera = myCamView.myCamera;
thread = new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
while(inServer == true){
try {
// 오늘날짜
Calendar calendar = Calendar.getInstance();
final String FileName = String.format("%02d%02d%02d-%02d%02d%02d",
calendar.get(Calendar.YEAR) % 100, calendar.get(Calendar.MONTH)+1,
calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND));
sv.getRootView().setDrawingCacheEnabled(true);
sv.getRootView().buildDrawingCache();
Bitmap bm = sv.getRootView().getDrawingCache();
ImageView bitmapImageView = (ImageView)findViewById(R.id.bitmap_image_view);
if (bm == null) {
bitmapImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.launcher_icon));
Log.i("인식결과 이미지 출력", "실패");
} else {
bitmapImageView.setImageBitmap(bm);
mFileName = FileName + ".jpg";
try {
File fileCacheItem = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), mFileName);
OutputStream out1 = null;
fileCacheItem.createNewFile();
out1 = new FileOutputStream(fileCacheItem);
bm.compress(CompressFormat.JPEG, 100, out1);
doFileUpload(fileCacheItem); // 파일전송
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
Thread.sleep(1000);
} catch (Exception e) {
Log.i("thread", "run-failed");
}
}
}
});
thread.start();
}
.
.
.
public void doFileUpload(File fileCacheItem){
.
.
.
}
}
CameraView.java
public class CameraView extends View implements SurfaceHolder.Callback, View.OnTouchListener{
private AudioManager mAudioManager = null;
public Camera myCamera = null;
private MediaRecorder myMediaRecorder = null;
public SurfaceHolder myCamSHolder;
public SurfaceView myCameraSView;
private String mFileName;
File fileCacheItem;
Thread thread;
MainActivity mactivity = new MainActivity();
// 오늘날짜
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyy.MM.dd", Locale.KOREA);
Date currentTime = new Date();
String mTime = mSimpleDateFormat.format(currentTime);
public CameraView(Context c, AttributeSet attr){
super(c, attr);
mAudioManager = (AudioManager)c.getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);
}
public void SetupCamera(SurfaceView sv){
myCameraSView = sv;
myCamSHolder = myCameraSView.getHolder();
myCamSHolder.addCallback(this);
myCamSHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
myCamera = Camera.open();
setOnTouchListener(this);
}
public void PrepareMedia(int wid, int hei) {
myMediaRecorder = new MediaRecorder();
myCamera.stopPreview();
myCamera.unlock();
myMediaRecorder.setCamera(myCamera);
myMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
myMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
CamcorderProfile targetProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
targetProfile.videoFrameWidth = wid;
targetProfile.videoFrameHeight = hei;
targetProfile.videoFrameRate = 25;
targetProfile.videoBitRate = 512*1024;
targetProfile.videoCodec = MediaRecorder.VideoEncoder.H264;
targetProfile.audioCodec = MediaRecorder.AudioEncoder.AMR_NB;
targetProfile.fileFormat = MediaRecorder.OutputFormat.MPEG_4;
myMediaRecorder.setProfile(targetProfile);
}
private boolean realyStart() {
myMediaRecorder.setPreviewDisplay(myCamSHolder.getSurface());
try {
myMediaRecorder.prepare();
} catch (IllegalStateException e) {
releaseMediaRecorder();
Log.d("TEAONLY", "JAVA: camera prepare illegal error");
return false;
} catch (IOException e) {
releaseMediaRecorder();
Log.d("TEAONLY", "JAVA: camera prepare io error");
return false;
}
try {
myMediaRecorder.start();
} catch( Exception e) {
releaseMediaRecorder();
Log.d("TEAONLY", "JAVA: camera start error");
return false;
}
return true;
}
public boolean StartStreaming(FileDescriptor targetFd) {
myMediaRecorder.setOutputFile(targetFd);
myMediaRecorder.setMaxDuration(9600000); // Set max duration 4 hours
//myMediaRecorder.setMaxFileSize(1600000000); // Set max file size 16G
myMediaRecorder.setOnInfoListener(streamingEventHandler);
return realyStart();
}
public boolean StartRecording(String targetFile) {
myMediaRecorder.setOutputFile(targetFile);
return realyStart();
}
public void StopMedia() {
myMediaRecorder.stop();
releaseMediaRecorder();
}
private void releaseMediaRecorder(){
if (myMediaRecorder != null) {
myMediaRecorder.reset(); // clear recorder configuration
myMediaRecorder.release(); // release the recorder object
myMediaRecorder = null;
myCamera.lock(); // lock camera for later use
myCamera.startPreview();
}
myMediaRecorder = null;
}
private MediaRecorder.OnInfoListener streamingEventHandler = new MediaRecorder.OnInfoListener() {
public void onInfo(MediaRecorder mr, int what, int extra) {
Log.d("TEAONLY", "MediaRecorder event = " + what);
}
};
public void surfaceChanged(SurfaceHolder sh, int format, int w, int h){
if ( myCamera != null && myMediaRecorder == null) {
myCamera.stopPreview();
try {
myCamera.setPreviewDisplay(sh);
} catch ( Exception ex) {
ex.printStackTrace();
}
myCamera.startPreview();
}
}
public void surfaceCreated(SurfaceHolder sh){
}
public void surfaceDestroyed(SurfaceHolder sh){
}
public boolean onTouch(View v, MotionEvent evt) {
return true;
}
}




미지원 하는 기기는 루팅해야 된다고 알아요