如何在Android相机捕获图像时设置实时帧

6

在此输入图片描述

我需要像上面的图片一样设置相机的实时帧。但是我的setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); getWidth(); getHeight(); Camera.PictureCallback等方法已经被弃用了。有人知道如何编写代码实现上述功能吗?

我使用了

public class CameraOverview1 extends Activity implements SurfaceHolder.Callback{
private Camera camera = null;
private SurfaceView cameraSurfaceView = null;
private SurfaceHolder cameraSurfaceHolder = null;
private boolean previewing = false;
private Display display = null;
private static int wid = 0, hgt = 0;
private LayoutInflater layoutInflater = null;
private View cameraViewControl = null;
private LayoutParams layoutParamsControl = null;
private Button btnCapture = null;
@Override
protected void onCreate(Bundle savedInstanceState) 
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

display = getWindowManager().getDefaultDisplay(); 
wid = display.getWidth();
hgt = display.getHeight();

getWindow().setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.cameraoverlay1);

cameraSurfaceView = (SurfaceView)findViewById(R.id.cameraSurfaceView);
cameraSurfaceHolder = cameraSurfaceView.getHolder();
cameraSurfaceHolder.addCallback(this);
cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

layoutInflater = LayoutInflater.from(getBaseContext());
layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);

cameraViewControl = layoutInflater.inflate(R.layout.cambutton, null);     
this.addContentView(cameraViewControl, layoutParamsControl);
btnCapture = (Button)findViewById(R.id.btnCapture);
btnCapture.setOnClickListener(new OnClickListener() 
{   
    @Override
    public void onClick(View v) 
    {
        // TODO Auto-generated method stub
        camera.takePicture(cameraShutterCallback, 
                cameraPictureCallbackRaw,
                cameraPictureCallbackJpeg);
    }
});
} 
ShutterCallback cameraShutterCallback = new ShutterCallback() 
{  
@Override
public void onShutter() 
{
    // TODO Auto-generated method stub   
}
};
PictureCallback cameraPictureCallbackRaw = new PictureCallback()
{  
@Override
public void onPictureTaken(byte[] data, Camera camera) 
{
    // TODO Auto-generated method stub   
}
};
PictureCallback cameraPictureCallbackJpeg = new PictureCallback() 
{  
@Override
public void onPictureTaken(byte[] data, Camera camera) 
{
    // TODO Auto-generated method stub   
    Bitmap cameraBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

    wid = cameraBitmap.getWidth();
    hgt = cameraBitmap.getHeight();

    Bitmap newImage = Bitmap.createBitmap(wid, hgt, Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(newImage);

    canvas.drawBitmap(cameraBitmap, 0f, 0f, null);

    Drawable drawable = getResources().getDrawable
            (R.drawable.frame1);
    drawable.setBounds(0, 0, wid, hgt);
    drawable.draw(canvas);

    File storagePath = new File(Environment.
            getExternalStorageDirectory() + "/MyCameraApp/"); 
    storagePath.mkdirs(); 

    File myImage = new File(storagePath,
            Long.toString(System.currentTimeMillis()) + ".jpg");

    try
    {
        FileOutputStream out = new FileOutputStream(myImage);
        newImage.compress(Bitmap.CompressFormat.JPEG, 80, out);


        out.flush();
        out.close();
    }
    catch(FileNotFoundException e)
    {
        Log.d("In Saving File", e + "");    
    }
    catch(IOException e)
    {
        Log.d("In Saving File", e + "");
    }

    camera.startPreview();

    drawable = null;

    newImage.recycle();
    newImage = null;

    cameraBitmap.recycle();
    cameraBitmap = null;
}
};
@Override
public void surfaceChanged(SurfaceHolder holder, 
    int format, int width, int height)
{
// TODO Auto-generated method stub

if(previewing)
{
    camera.stopPreview();
    previewing = false;
}
if (camera != null){
    try 
    {
camera.setPreviewDisplay(cameraSurfaceHolder);
        camera.startPreview();
        previewing = true;
    } 
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();  
    }
}
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
// TODO Auto-generated method stub
try
{
    camera = Camera.open();
}
catch(RuntimeException e)
{
    Toast.makeText(getApplicationContext(), "Device camera is not working properly, please try after sometime.", Toast.LENGTH_LONG).show();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
// TODO Auto-generated method stub
camera.stopPreview();
camera.release();
camera = null;
previewing = false;
}}

实际上,几乎所有东西都已被弃用。有什么意见吗?


你是指FPS还是总帧数? - Michele Lacorte
我正在开发一个类似于堆积照片框的应用程序。请看上面的图片。 - Varun Puravankara
所以您需要一个双预览前置和后置摄像头吗? - Michele Lacorte
猜想是这样。您知道代码(或任何网站链接)吗? - Varun Puravankara
1个回答

3

基于这个示例 android-Camera2Basic

我进行了一些更改,这是结果:

Camera2BasicFragmentFront.java

源码

Camera2BasicFragment.java

源码

AutoFitTextureView.java

源码

fragment_camera2_basic.xml (确保替换成com.YourPackage.AutoFitTextureView)

<?xml version="1.0" encoding="utf-8"?><!--
 Copyright 2014 The Android Open Source Project
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
     http://www.apache.org/licenses/LICENSE-2.0
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.YourPackage.AutoFitTextureView
        android:id="@+id/texture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true" />

</RelativeLayout>

activity_main.xml

<RelativeLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</FrameLayout>
<FrameLayout
android:id="@+id/containerFront"
android:layout_width="200dp"
android:layout_height="200dp" />
</RelativeLayout>

然后在MainActivity.java中:

public class MainActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (null == savedInstanceState) {
            getFragmentManager().beginTransaction()
                    .replace(R.id.container, Camera2BasicFragment.newInstance())
                    .commit();
            getFragmentManager().beginTransaction()
                    .replace(R.id.containerFront, Camera2BasicFragmentFront.newInstance())
                    .commit();
        }
    }
}

并使用这个权限在 Manifest.xml 文件中。

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

希望你能够享受这一切!

P.S. Java类中还包含保存照片的方法!


可以给我完整的源代码吗?我只是个初学者。 - Varun Puravankara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接