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实现动态切换横竖屏,保存横竖屏数据(用Preference存储)
  2. Android(安卓)应用语言设置的实现
  3. Android(安卓): 登录并保存密码
  4. Android的线程Handler实现
  5. android 学习笔记3--静默安装功能的实现
  6. Android利用Jpush实现异地登陆下线
  7. Android(安卓)集成百度地图实现设备定位
  8. Android(安卓)属性动画(Property Animation) 完全解析 (上)
  9. 浅谈Java中Collections.sort对List排序的两种方法

随机推荐

  1. android run/debug configurations时报错
  2. 2011.08.26——— android ListView之多
  3. Android中话bitmap的简单示例
  4. Android(安卓)判断SD卡是否存在及容量查
  5. Android(安卓)源码编译make的错误处理
  6. android中加载assets中的资源文件
  7. Android选项卡(TabWidget)应用
  8. android中加载assets中的资源文件
  9. 【翻译】(14)Stable APIs
  10. Android(安卓)Untold Stories