Java Android ViewPager,片段中的cameraview未显示

Java Android ViewPager,片段中的cameraview未显示,java,android,android-fragments,android-camera,android-fragmentactivity,Java,Android,Android Fragments,Android Camera,Android Fragmentactivity,我正在尝试创建一个包含3个片段的应用程序,我正在使用viewpager浏览它们 第一个是列表,第二个应该是相机,第三个也是列表。 刷卡有效,但当我到达第二个片段时,cameraPreview是黑色的。 我没有任何撞车或其他事情的痕迹。 我已经创建了这个应用程序的一部分,但没有刷卡,它确实工作了。在新应用中重新设置时,我没有更改片段,我只是将导入从android.app.fragment更改为android.support.v4.app.fragment 我使用此示例创建应用程序: 我的也没什么

我正在尝试创建一个包含3个片段的应用程序,我正在使用viewpager浏览它们
第一个是列表,第二个应该是相机,第三个也是列表。
刷卡有效,但当我到达第二个片段时,cameraPreview是黑色的。

我没有任何撞车或其他事情的痕迹。
我已经创建了这个应用程序的一部分,但没有刷卡,它确实工作了。在新应用中重新设置时,我没有更改片段,我只是将导入从android.app.fragment更改为android.support.v4.app.fragment

我使用此示例创建应用程序:

我的也没什么不同,我想感谢哈克索的伟大解释,它真的帮助了我。我还没法投票,所以我要这样感谢你:)

MainActivity.class:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.View;
import android.widget.LinearLayout;


public class MainActivity extends FragmentActivity {

LinearLayout ButtonBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
    pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
}


private class MyPagerAdapter extends FragmentPagerAdapter {

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int pos) {
        switch(pos) {
            case 0:
                return FirstFragment.newInstance("FirstFragment, Instance 1");
            case 1:
                return SecondFragment.newInstance("SecondFragment, Instance 1");
            case 2:
                return ThirdFragment.newInstance("ThirdFragment, Instance 1");
            default:
                return ThirdFragment.newInstance("ThirdFragment, Default");
        }
    }

    @Override
    public int getCount() {
        return 3;
    }
}
}
activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context=".MainActivity"
android:background="#ffff">

<android.support.v4.view.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>
</RelativeLayout>

第二个fragment.class:

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.io.IOException;
import java.io.OutputStream;

/**
 * Created by Gebruiker on 29-10-2014.
 */
public class SecondFragment extends Fragment {

View rootView;
ImageButton cameraShootButton;
ImageButton cameraChangeButton;
Boolean switching = false;
View.OnClickListener tapper = null;
SurfaceView cameraPreview = null;
SurfaceHolder cameraPreviewHolder = null;
Camera camera = null;
boolean inPreview = false;
boolean cameraConfigured = false;
Integer currentCamera;

public static SecondFragment newInstance(String text) {

    SecondFragment f = new SecondFragment();
    Bundle b = new Bundle();
    b.putString("msg", text);

    f.setArguments(b);

    return f;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.second_frag, container, false);


    cameraShootButton = (ImageButton) rootView.findViewById(R.id.captureB);
    cameraChangeButton = (ImageButton) rootView.findViewById(R.id.changeCameraB);
    cameraPreview = (SurfaceView) rootView.findViewById(R.id.cameraView);

    cameraPreviewHolder = cameraPreview.getHolder();
    cameraPreviewHolder.addCallback(surfaceCallback);
    cameraPreviewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


    tapper = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.captureB) {
                camera.takePicture(ShutterCallback, PictureCallbackRaw, null, PictureCallbackJpeg);
            } else if (v.getId() == R.id.changeCameraB) {
                if (switching == true){
                    return;
                }
                changeCamera();
            }
        }
    };

    cameraShootButton.setOnClickListener(tapper);
    cameraChangeButton.setOnClickListener(tapper);
    return rootView;
}

@Override
public void onResume() {
    super.onResume();
    camera = getCamera("back");
    currentCamera = 1;
    startPreview();
}

@Override
public void onPause() {
    if (inPreview) {
        camera.stopPreview();
    }
    camera.release();
    camera = null;
    inPreview = false;

    super.onPause();
}

private Camera.Size getBestPreviewSize(int width, int height,
                                       Camera.Parameters parameters) {
    Camera.Size result = null;

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
        if (size.width <= width && size.height <= height) {
            if (result == null) {
                result = size;
            } else {
                int resultArea = result.width * result.height;
                int newArea = size.width * size.height;

                if (newArea > resultArea) {
                    result = size;
                }
            }
        }
    }

    return (result);
}

private void initPreview(int width, int height) {
    if (camera != null && cameraPreviewHolder.getSurface() != null) {
        try {
            camera.setPreviewDisplay(cameraPreviewHolder);
        } catch (Throwable t) {
            Log.e("PreviewDemo-surfaceCallback",
                    "Exception in setPreviewDisplay()", t);
        }

        if (!cameraConfigured) {
            Camera.Parameters parameters = camera.getParameters();
            Log.v("CAMERA", parameters.toString());
            Camera.Size size = getBestPreviewSize(width, height,
                    parameters);

            if (size != null) {
                Log.v("CameraPreviewHeight", ""+cameraPreview.getMeasuredHeight());
                Log.v("CameraRES", size.width + " " + size.height);
                parameters.setPreviewSize(size.width, size.height);
                camera.setParameters(parameters);
                cameraConfigured = true;
            }
        }
    }
}

private void startPreview() {
    if (cameraConfigured && camera != null) {
        camera.startPreview();
        inPreview = true;
        camera.setDisplayOrientation(90);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
            camera.enableShutterSound(false);
        }
    }
}

private void changeCamera() {
    switching = true;
    if (inPreview) {
        camera.stopPreview();
        camera.setPreviewCallback(null);
    }
    camera.release();
    camera = null;
    inPreview = false;
    if (currentCamera==1){
        camera = getCamera("front");
        currentCamera =2;
    }
    else{
        camera = getCamera("back");
        currentCamera = 1;
    }
    camera.setDisplayOrientation(90);
    try {
        camera.setPreviewDisplay(cameraPreviewHolder);
        cameraPreviewHolder.addCallback(surfaceCallback);
        camera.startPreview();
    } catch (IOException e) {
        e.printStackTrace();
    }

    inPreview = true;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
        camera.enableShutterSound(false);
    }
    switching = false;

}

SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
    public void surfaceCreated(SurfaceHolder holder) {
        // no-op -- wait until surfaceChanged()
    }

    public void surfaceChanged(SurfaceHolder holder,
                               int format, int width,
                               int height) {
        initPreview(width, height);
        startPreview();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // no-op
    }
};

Camera.ShutterCallback ShutterCallback = new Camera.ShutterCallback() {
    public void surfaceCreated(SurfaceHolder holder) {
        // no-op -- wait until surfaceChanged()
    }

    public void surfaceChanged(SurfaceHolder holder,
                               int format, int width,
                               int height) {
        initPreview(width, height);
        startPreview();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // no-op
    }

    @Override
    public void onShutter() {

    }
};

Camera.PictureCallback PictureCallbackRaw = new Camera.PictureCallback() {
    public void surfaceCreated(SurfaceHolder holder) {
        // no-op -- wait until surfaceChanged()
    }

    public void surfaceChanged(SurfaceHolder holder,
                               int format, int width,
                               int height) {
        initPreview(width, height);
        startPreview();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // no-op
    }

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

    }
};

Camera.PictureCallback PictureCallbackJpeg = new Camera.PictureCallback() {
    public void surfaceCreated(SurfaceHolder holder) {
        // no-op -- wait until surfaceChanged()
    }

    public void surfaceChanged(SurfaceHolder holder,
                               int format, int width,
                               int height) {
        initPreview(width, height);
        startPreview();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // no-op
    }

    @Override
    public void onPictureTaken(byte[] byteData, Camera camera) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 5;
        OutputStream bos = null;
        Bitmap m = BitmapFactory.decodeByteArray(byteData, 0, byteData.length, options);

        //m.compress(Bitmap.CompressFormat.PNG, 75, bos);
        //Log.v("CAPTURED", ""+bos);
    }
};

private Camera getCamera(String getCamera) {
    int cameraCount = 0;
    Camera cam = null;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
        Camera.getCameraInfo(camIdx, cameraInfo);
        if ((cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) && (getCamera == "front")) {
            try {
                cam = Camera.open(camIdx);
            } catch (RuntimeException e) {
                Log.e("TEST", "Camera failed to open: " + e.getLocalizedMessage());
            }
        }
        else if ((cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) && (getCamera == "back")) {
            try {
                cam = Camera.open(camIdx);
            } catch (RuntimeException e) {
                Log.e("TEST", "Camera failed to open: " + e.getLocalizedMessage());
            }
        }
    }
    return cam;
}


}
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.hardware.Camera;
导入android.os.Build;
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.SurfaceHolder;
导入android.view.SurfaceView;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageButton;
导入android.widget.LinearLayout;
导入android.widget.TextView;
导入java.io.IOException;
导入java.io.OutputStream;
/**
*由Gebruiker于2014年10月29日创建。
*/
公共类SecondFragment扩展了片段{
视图根视图;
图像按钮摄像按钮;
图像按钮摄像机切换按钮;
布尔转换=假;
View.OnClickListener tapper=null;
SurfaceView cameraPreview=null;
SurfaceHolder CameraPreviewWholder=null;
摄像头=空;
布尔inPreview=false;
布尔cameraConfigured=false;
整型摄像机;
公共静态SecondFragment newInstance(字符串文本){
SecondFragment f=新的SecondFragment();
Bundle b=新Bundle();
b、 putString(“msg”,文本);
f、 设置参数(b);
返回f;
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
rootView=充气机。充气(右布局第二框架,容器,假);
cameraShootButton=(ImageButton)rootView.findViewById(R.id.captureB);
cameraChangeButton=(ImageButton)rootView.findViewById(R.id.changeCameraB);
cameraPreview=(SurfaceView)rootView.findviewbyd(R.id.cameraView);
CamerapReviewWholder=cameraPreview.getHolder();
CamerapReviewWholder.addCallback(surfaceCallback);
CamerapReviewWholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_缓冲区);
tapper=newview.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(v.getId()==R.id.captureB){
照相/摄像(ShutterCallback、PictureCallbackRaw、null、PictureCallbackJpeg);
}else if(v.getId()==R.id.changeCameraB){
如果(切换==真){
返回;
}
更换摄像头();
}
}
};
cameraShootButton.setOnClickListener(tapper);
cameraChangeButton.setOnClickListener(tapper);
返回rootView;
}
@凌驾
恢复时公开作废(){
super.onResume();
摄像头=获取摄像头(“背面”);
currentCamera=1;
startPreview();
}
@凌驾
公共无效暂停(){
如果(审查){
camera.stopPreview();
}
相机。释放();
摄像机=零;
inPreview=false;
super.onPause();
}
私人相机。大小getBestPreviewSize(整数宽度,整数高度,
摄像机(参数){
Camera.Size结果=null;
对于(Camera.Size:parameters.getSupportedPreviewSizes()){
如果(size.width=Build.VERSION\u code.ICE\u SANDWICH\u MR1){
摄像头。启用快门声音(错误);
}
}
}
私人摄像机(){
切换=真;
如果(审查){
camera.stopPreview();
camera.setPreviewCallback(空);
}
相机。释放();
摄像机=零;
inPreview=false;
如果(currentCamera==1){
摄像头=获取摄像头(“前”);
currentCamera=2;
}
否则{
摄像头=获取摄像头(“背面”);
currentCamera=1;
}
摄像头。设置显示方向(90);
试一试{
camera.setPreviewDisplay(CameraPreviewWholder);
CamerapReviewWholder.addCallback(surfaceCallback);
camera.startPreview();
}捕获(IOE异常){
e、 printStackTrace();
}
inPreview=true;
如果(Build.VERSION.SDK\u INT>=Build.VERSION\u代码.冰淇淋\u三明治\u MR1){
摄像头。启用快门声音(错误);
}
切换=错误;
}
SurfaceHolder.Callback surfaceCallback=新建SurfaceHolder.Callback(){
已创建的公共空白表面(表面持有人){
//无操作--等待surfaceChanged()完成
}
公共空间表面变更(表面持有人,
整数格式,整数宽度,
整数高度){
初始预览(宽度、高度);
startPreview();
}
公共空间表面覆盖(表面覆盖物持有人){
//无操作
}
};
Camera.ShutterCallback ShutterCallback=新建Camera.ShutterCallback(){
已创建的公共空白表面(表面持有人){
//无操作--等待surfaceChanged()完成
}
公共空间表面变更(表面持有人,
整数格式,整数宽度,
整数高度){
初始预览(宽度、高度);
startPreview();
}
公共空间表面覆盖(表面覆盖物持有人){
//无操作
}
@凌驾
公共空间{
}
};
Camera.PictureCallback PictureCallbackRaw=新建Camera.PictureCallback(){
已创建的公共空白表面(表面持有人){
//不,等等
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.view.SurfaceView
    android:id="@+id/cameraView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_alignParentBottom="true">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center">

        <ImageButton
            android:id="@+id/flitserB"
            android:layout_width="30dp"
            android:layout_height="70dp"
            android:scaleType="fitCenter"
            android:src="@drawable/flash"
            android:background="@null"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center">
        <ImageButton
            android:id="@+id/captureB"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:scaleType="fitCenter"
            android:src="@drawable/camerashoot"
            android:background="@null"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center">
        <ImageButton
            android:id="@+id/changeCameraB"
            android:layout_width="30dp"
            android:layout_height="70dp"
            android:scaleType="fitCenter"
            android:src="@drawable/camerachange"
            android:background="@null"/>

    </LinearLayout>

</LinearLayout>


</RelativeLayout>
<uses-permission android:name="android.permission.CAMERA" />