我用照相机API和调用摄像头。
我要上的摄像头preVIEW顶部显示标题(品牌推广)。标题为JPEG图像。
这可能吗?任何帮助AP preciated。
在此先感谢。
我的code进入如下图所示。
公共类CameraActivity延伸活动{
@覆盖
保护无效的onPause(){
super.onPause();
}
私有静态最终诠释CAMERA_PIC_REQUEST = 2500;
私人位图图像2;
私人位图BM;
公共静态字符串的ImagePath;
公共静态INT X = 1;
私人RdmsDbAdapter dbHelper;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.header);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// caling新事件
如果(IncidentFormActivity.incident_id == NULL || IncidentFormActivity.isDisable ==真){
// DBAdapter实例创建和打开连接。
dbHelper =新RdmsDbAdapter(CameraActivity.this);
dbHelper.open();
//设置标志
NewIncidentHelper美国国立卫生研究院=新NewIncidentHelper();
nih.setUpNewIncident();
//设置incident_id
字符串日期= IncidentIdGenerator.getDate();
字符串时间= IncidentIdGenerator.getTime();
IncidentFormActivity.incident_id = IncidentIdGenerator.now(ddMMyyyyHHmmss);
dbHelper.executeSQL(插入事件的值('+ IncidentFormActivity.incident_id
+','','','','','+日期+','0','0','0','0','0','0','0' ,'0','0','+时间+'));
dbHelper.close();
}
//调用摄像头
意图cameraIntent =新的意图(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent,CAMERA_PIC_REQUEST);
}
公共字符串getPath(URI URI){
的String []投影= {MediaStore.Images.Media.DATA};
光标光标= managedQuery(URI,投影,NULL,NULL,NULL);
INT与Column_Index =光标
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
返回cursor.getString(Column_Index中);
}
在电话pressed //返回键
@覆盖
公共布尔的onkeydown(INT键code,KeyEvent的事件){
开关(钥匙code){
案例KeyEvent.KEY code_BACK:
意图I =新的意图(CameraActivity.this,IncidentFormActivity.class);
startActivity(ⅰ);
this.finish();
打破;
默认:
打破;
}
返回super.onKeyDown(键code,事件);
}
从相机//处理反应过来的照片拍摄后。
保护无效onActivityResult(INT申请code,INT结果code,意图数据){
如果(要求code == CAMERA_PIC_REQUEST和放大器;&安培;结果code == RESULT_OK){
最后ImageView的IMG =新ImageView的(这一点);
img.setLayoutParams(新的LayoutParams(100,100));
。IMAGE2 =(位图)data.getExtras()获得(数据);
img.setImageBitmap(IMAGE2);
字符串incident_ID = IncidentFormActivity.incident_id;
//l2.addView(img);
的ImagePath =/ SD卡/关系数据库管理系统/+ incident_ID + X +的.png;
档案文件=新的文件(的ImagePath);
尝试 {
BM = Bitmap.createScaledBitmap(image2,400,300,真正的);
file.createNewFile();
FileOutputStream中的ostream =新的FileOutputStream(文件);
bm.com preSS(比较pressFormat.PNG,90,ostream的);
ostream.close();
//正在初始化数据库类,并插入值
dbHelper =新RdmsDbAdapter(CameraActivity.this);
dbHelper.open();
dbHelper.executeSQL(插入到文件中的值('+的ImagePath +','+ IncidentFormActivity.incident_id +'));
dbHelper.close();
}赶上(例外五){
e.printStackTrace();
Toast.makeText(getApplicationContext(),yourfirst错误消息
+ e.toString(),1000).show();
}
X ++;
最后AlertDialog.Builder警报=新AlertDialog.Builder(
CameraActivity.this);
alert.setTitle(的getString(R.string.anotherimage));
alert.setCancelable(假);
//alert.setMessage("Play或删除所选)的视频;
//alert.setIcon(R.drawable.vid_red);
alert.setPositiveButton(的getString(R.string.yes),新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话框,INT ID){
意图sendingpage =新的意图(CameraActivity.this,CameraActivity.class);
startActivity(sendingpage);
}
});
alert.setNegativeButton(的getString(R.string.no)
新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话框,INT ID){
意图回调=新的意图(CameraActivity.this,IncidentFormActivity.class);
startActivity(回调);
}
});
alert.show();
}
如果(结果code == RESULT_CANCELED)
{
AlertDialog.Builder建设者=新AlertDialog.Builder(CameraActivity.this);
builder.setMessage(的getString(R.string.areuexit))。setCancelable(
假).setPositiveButton(的getString(R.string.yes)
新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话框,INT ID){
意图I =新的意图(CameraActivity.this,IncidentFormActivity.class);
startActivity(ⅰ);
CameraActivity.this.finish();
}
})。setNegativeButton(的getString(R.string.no)
新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话框,INT ID){
dialog.cancel();
意图I =新的意图(CameraActivity.this,CameraActivity.class); startActivity(ⅰ);
CameraActivity.this.finish();
}
});
builder.show();
}
}
}
解决方案
您可以使用SurfaceView,并创建一个CustomView,将打开摄像头,你可以在XML相应地调整其大小。下面是一个伪code。
创建扩展SurfaceView和开放的相机内,一个类
捕捉preview.java
公共类捕获preVIEW延伸SurfaceView实现SurfaceHolder.Callback {
公共静态位图mBitmap;
SurfaceHolder持有人;
静态相机mCamera;
公共捕捉preVIEW(上下文的背景下,ATTRS的AttributeSet){
超(背景下,ATTRS);
支架= getHolder();
holder.addCallback(本);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@覆盖
公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,高度INT){
Camera.Parameters参数= mCamera.getParameters();
parameters.getSupported previewSizes();
mCamera.setParameters(参数);
mCamera.start preVIEW();
}
@覆盖
公共无效surfaceCreated(SurfaceHolder持有者){
尝试 {
mCamera = Camera.open();
mCamera.set previewDisplay(保持器);
}赶上(例外五){
e.printStackTrace();
}
}
@覆盖
公共无效surfaceDestroyed(SurfaceHolder持有者){
mCamera.stop preVIEW();
mCamera.release();
}
/ ***
*
*拍照,并和从字节[]为位图转换。
*
* /
公共静态无效takeAPicture(){
Camera.PictureCallback mPictureCallback =新PictureCallback(){
@覆盖
公共无效onPictureTaken(byte []的数据,摄像头摄像头){
BitmapFactory.Options选项=新BitmapFactory.Options();
mBitmap = BitmapFactory.de codeByteArray(数据,0,data.length,期权);
}
};
mCamera.takePicture(NULL,NULL,mPictureCallback);
}
}
现在,你必须包括您在使用SurfaceView在XML创建这样的观点
的main.xml
< XML版本=1.0编码=UTF-8&GT?;
< RelativeLayout的
的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:方向=垂直
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT>
<的FrameLayout
机器人:ID =@ + ID / mySurfaceView
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT>
< com.cam.Capture preVIEW
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT>
< /com.cam.Capture$p$pview>
< /的FrameLayout>
<的LinearLayout
机器人:layout_below =@ ID / mySurfaceView
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_centerInParent =真
机器人:重力=中心>
< ImageView的机器人:ID =@ + ID / myImageView
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:SRC =@可绘制/图标/>
< / LinearLayout中>
< / RelativeLayout的>
现在你可以在任何 Acitivty
,将打开一个摄像头,一个的ImageView
使用main.xml中。
谢谢....
I'm using Camera API and invoking the camera.
I want to display a header (for branding) on the top of the camera preview. The header is a jpeg image.
Is it possible? Any help appreciated.
Thanks in advance.
My code goes as below.
public class CameraActivity extends Activity {
@Override
protected void onPause() {
super.onPause();
}
private static final int CAMERA_PIC_REQUEST = 2500;
private Bitmap image2;
private Bitmap bm;
public static String imagepath;
public static int x=1;
private RdmsDbAdapter dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.header);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//caling new incident
if(IncidentFormActivity.incident_id == null || IncidentFormActivity.isDisable==true){
//DBAdapter instance created and connection opened.
dbHelper = new RdmsDbAdapter(CameraActivity.this);
dbHelper.open();
//setting up flags
NewIncidentHelper nih = new NewIncidentHelper();
nih.setUpNewIncident();
//setting up incident_id
String Date= IncidentIdGenerator.getDate();
String Time = IncidentIdGenerator.getTime();
IncidentFormActivity.incident_id = IncidentIdGenerator.now("ddMMyyyyHHmmss");
dbHelper.executeSQL("insert into incident values ('" + IncidentFormActivity.incident_id
+ "', ' ', ' ', ' ', ' ', '"+Date+"', '0','0','0','0','0','0','0','0','0','"+Time+"')");
dbHelper.close();
}
//calling camera
Intent cameraIntent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
}
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
//back key on phone pressed
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
Intent i= new Intent(CameraActivity.this, IncidentFormActivity.class);
startActivity(i);
this.finish();
break;
default:
break;
}
return super.onKeyDown(keyCode, event);
}
//handle response came from camera when the picture is taken.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK) {
final ImageView img = new ImageView(this);
img.setLayoutParams(new LayoutParams(100, 100));
image2 = (Bitmap) data.getExtras().get("data");
img.setImageBitmap(image2);
String incident_ID = IncidentFormActivity.incident_id;
//l2.addView(img);
imagepath="/sdcard/RDMS/"+incident_ID+ x + ".png";
File file = new File(imagepath);
try {
bm = Bitmap.createScaledBitmap( image2,400, 300, true);
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bm.compress(CompressFormat.PNG, 90, ostream);
ostream.close();
//Initialising db class and inserting values
dbHelper = new RdmsDbAdapter(CameraActivity.this);
dbHelper.open();
dbHelper.executeSQL("insert into files values ('"+imagepath+"', '"+IncidentFormActivity.incident_id+"')");
dbHelper.close();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),"yourfirst error message is "
+ e.toString(), 1000).show();
}
x++;
final AlertDialog.Builder alert = new AlertDialog.Builder(
CameraActivity.this);
alert.setTitle(getString(R.string.anotherimage));
alert.setCancelable(false);
//alert.setMessage("Play or Delete the Video selected");
//alert.setIcon(R.drawable.vid_red);
alert.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent sendingpage = new Intent(CameraActivity.this, CameraActivity.class);
startActivity(sendingpage);
}
});
alert.setNegativeButton(getString(R.string.no),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent callback = new Intent (CameraActivity.this, IncidentFormActivity.class);
startActivity(callback);
}
});
alert.show();
}
if(resultCode==RESULT_CANCELED)
{
AlertDialog.Builder builder = new AlertDialog.Builder(CameraActivity.this);
builder.setMessage(getString(R.string.areuexit)).setCancelable(
false).setPositiveButton(getString(R.string.yes),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent i= new Intent(CameraActivity.this, IncidentFormActivity.class);
startActivity(i);
CameraActivity.this.finish();
}
}).setNegativeButton(getString(R.string.no),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
Intent i= new Intent(CameraActivity.this, CameraActivity.class); startActivity(i);
CameraActivity.this.finish();
}
});
builder.show();
}
}
}
解决方案
You can use SurfaceView and create a CustomView that will open the camera and you can adjust its size in the xml accordingly. Below is a pseudo code.
Create a class that extends SurfaceView and open camera inside that
CapturePreview.java
public class CapturePreview extends SurfaceView implements SurfaceHolder.Callback{
public static Bitmap mBitmap;
SurfaceHolder holder;
static Camera mCamera;
public CapturePreview(Context context, AttributeSet attrs) {
super(context, attrs);
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.getSupportedPreviewSizes();
mCamera.setParameters(parameters);
mCamera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open();
mCamera.setPreviewDisplay(holder);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
}
/***
*
* Take a picture and and convert it from bytes[] to Bitmap.
*
*/
public static void takeAPicture(){
Camera.PictureCallback mPictureCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
BitmapFactory.Options options = new BitmapFactory.Options();
mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);
}
};
mCamera.takePicture(null, null, mPictureCallback);
}
}
Now you have to include the view that you created using SurfaceView in your xml like this
main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@+id/mySurfaceView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.cam.CapturePreview
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</com.cam.CapturePreview>
</FrameLayout>
<LinearLayout
android:layout_below="@id/mySurfaceView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center">
<ImageView android:id="@+id/myImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon"/>
</LinearLayout>
</RelativeLayout>
Now you can use this main.xml in any Acitivty
that will open a camera with a ImageView
.
Thanks....
相关推荐
最新文章