AndroidMainfest.xml文件(需要camera权限):

1

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

activity_main.xml文件:

 

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.bihu.qdemopush.MainActivity">

 

<LinearLayout

  android:layout_width="match_parent"

  android:layout_height="200dp"

  android:orientation="horizontal">

  <SurfaceView

    android:id="@+id/surfaceview1"

    android:layout_width="0dp"

    android:layout_weight="1"

    android:layout_height="fill_parent" />

  <SurfaceView

    android:id="@+id/surfaceview2"

    android:layout_width="0dp"

    android:layout_weight="1"

    android:layout_marginLeft="5dp"

    android:layout_height="fill_parent" />

LinearLayout>

LinearLayout>

MainActivity.java文件:主要是对2个surfaceView的显示渲染

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

public class MainActivity extends AppCompatActivity {

 

SurfaceView surfaceview1, surfaceview2;

SurfaceHolder surfaceholder1, surfaceholder2;

String TAG = "MainActivity";

private Camera camera1 = null, camera2;

Camera.Parameters parameters;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

 

  surfaceview1 = (SurfaceView) findViewById(R.id.surfaceview1);

  surfaceview2 = (SurfaceView) findViewById(R.id.surfaceview2);

  surfaceholder1 = surfaceview1.getHolder();

  surfaceholder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  surfaceholder1.addCallback(new surfaceholderCallbackBack());

 

  surfaceholder2 = surfaceview2.getHolder();

  surfaceholder2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  surfaceholder2.addCallback(new surfaceholderCallbackFont());

}

 

@Override

protected void onDestroy() {

  Log.e(TAG, "onDestroy");

  super.onDestroy();

}

 

/**

 * 后置摄像头回调

 */

class surfaceholderCallbackBack implements SurfaceHolder.Callback {

  @Override

  public void surfaceCreated(SurfaceHolder holder) {

    // 获取camera对象

    int cameraCount = Camera.getNumberOfCameras();

    if (cameraCount > 0) {

      camera1 = Camera.open(0);

      try {

        // 设置预览监听

        camera1.setPreviewDisplay(holder);

        Camera.Parameters parameters = camera1.getParameters();

 

        if (MainActivity.this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {

          parameters.set("orientation", "portrait");

          camera1.setDisplayOrientation(90);

          parameters.setRotation(90);

        } else {

          parameters.set("orientation", "landscape");

          camera1.setDisplayOrientation(0);

          parameters.setRotation(0);

        }

        camera1.setParameters(parameters);

        // 启动摄像头预览

        camera1.startPreview();

        System.out.println("camera.startpreview");

 

      } catch (IOException e) {

        e.printStackTrace();

        camera1.release();

        System.out.println("camera.release");

      }

    }

  }

 

  @Override

  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    camera1.autoFocus(new Camera.AutoFocusCallback() {

      @Override

      public void onAutoFocus(boolean success, Camera camera) {

        if (success) {

          initCamera();// 实现相机的参数初始化

          camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。

        }

      }

    });

 

  }

 

  @Override

  public void surfaceDestroyed(SurfaceHolder holder) {

 

  }

 

  // 相机参数的初始化设置

  private void initCamera() {

    parameters = camera1.getParameters();

    parameters.setPictureFormat(PixelFormat.JPEG);

    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦

    setDispaly(parameters, camera1);

    camera1.setParameters(parameters);

    camera1.startPreview();

    camera1.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上

  }

 

  // 控制图像的正确显示方向

  private void setDispaly(Camera.Parameters parameters, Camera camera) {

    if (Integer.parseInt(Build.VERSION.SDK) >= 8) {

      setDisplayOrientation(camera, 90);

    } else {

      parameters.setRotation(90);

    }

 

  }

 

  // 实现的图像的正确显示

  private void setDisplayOrientation(Camera camera, int i) {

    Method downPolymorphic;

    try {

      downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});

      if (downPolymorphic != null) {

        downPolymorphic.invoke(camera, new Object[]{i});

      }

    } catch (Exception e) {

      Log.e("Came_e", "图像出错");

    }

  }

}

 

class surfaceholderCallbackFont implements SurfaceHolder.Callback {

  @Override

  public void surfaceCreated(SurfaceHolder holder) {

    // 获取camera对象

    int cameraCount = Camera.getNumberOfCameras();

    if (cameraCount == 2) {

      camera2 = Camera.open(1);

    }

    try {

      // 设置预览监听

      camera2.setPreviewDisplay(holder);

      Camera.Parameters parameters = camera2.getParameters();

 

      if (MainActivity.this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {

        parameters.set("orientation", "portrait");

        camera2.setDisplayOrientation(90);

        parameters.setRotation(90);

      } else {

        parameters.set("orientation", "landscape");

        camera2.setDisplayOrientation(0);

        parameters.setRotation(0);

      }

      camera2.setParameters(parameters);

      // 启动摄像头预览

      camera2.startPreview();

      System.out.println("camera.startpreview");

 

    } catch (IOException e) {

      e.printStackTrace();

      camera2.release();

      System.out.println("camera.release");

    }

  }

 

  @Override

  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    camera2.autoFocus(new Camera.AutoFocusCallback() {

      @Override

      public void onAutoFocus(boolean success, Camera camera) {

        if (success) {

          parameters = camera2.getParameters();

          parameters.setPictureFormat(PixelFormat.JPEG);

          parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦

          setDispaly(parameters, camera2);

          camera2.setParameters(parameters);

          camera2.startPreview();

          camera2.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上

          camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。

        }

      }

    });

 

  }

 

  @Override

  public void surfaceDestroyed(SurfaceHolder holder) {

 

  }

 

  // 控制图像的正确显示方向

  private void setDispaly(Camera.Parameters parameters, Camera camera) {

    if (Integer.parseInt(Build.VERSION.SDK) >= 8) {

      setDisplayOrientation(camera, 90);

    } else {

      parameters.setRotation(90);

    }

 

  }

 

  // 实现的图像的正确显示

  private void setDisplayOrientation(Camera camera, int i) {

    Method downPolymorphic;

    try {

      downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});

      if (downPolymorphic != null) {

        downPolymorphic.invoke(camera, new Object[]{i});

      }

    } catch (Exception e) {

      Log.e("Came_e", "图像出错");

    }

  }

}

}

可能出现的问题:

1、没有权限,需要手动打开,代码里由于追求简便,没有主动申请,只在mainfest中注册了

更多相关文章

  1. Android创建XMl文件
  2. android 读取SD卡或者其他地方文件功能函数
  3. android通过servlet服务器保存文件到手机
  4. Android 文件选择器,单选,多选
  5. Android利用TTF文件设置字体
  6. android 保存bitmap到指定文件
  7. android 打开摄像头的代码
  8. 向SD卡写文件

随机推荐

  1. Mars Android视频学习笔记——01_16_SQLi
  2. Smalidea+IntelliJ IDEA/Android Studio
  3. Android高效编程注意事项
  4. Android(安卓)7.0 Settings Summary 小记
  5. Android学习笔记(九)ListView
  6. ReactNative入门-Android原生项目转RN项
  7. Android AutoCompleteTextView动态自动补
  8. Android App性能优化之内存优化
  9. 三种安卓模拟器的安装和比较
  10. Android创建wifi热点爬坑总结