谷歌做了一个艰难的决定:安卓系统不再用Java API 了

12月 29 日有人在 Hacker News 上爆料,安卓代码库中出现了神秘的代码提交(commit),修改了 8902 个文件,并且在 commit 中明确说了:
Initial import of OpenJdk files.
Create new libcore/ojluni directory with src/main/java and src/main/native subdirectiories.
Build ojluni into core-oj jar.
Use openjdk classes from java.awt.font package.
Copy all files from jdk/src/share/classes and jdk/src/solaris/classes directories in openjdk into libcore/ojluni/src/main/java.
Copy following native files from openjdk to libcore/ojluni/src/main/native: [long list of files]
大家开始猜测,谷歌这是要用 OpenJDK 换掉 Android 系统中在用的 Java API。至于为什么会有这个决定,建议看看伯乐在线的这篇文章《(甲骨文)紧咬 9 行代码,索赔超 10 亿美元》。
随后国外科技博客 VentureBeat 去向谷歌求证实。谷歌确认 Android N 系统将只基于 OpenJDK (JDK 的开源版本)。谷歌的一位发言人表示:
「作为一个开源平台,Android 是建立在开源社区协作的基础之上。在即将发布的 Android 新版本中,我们计划把 Android 的 Java 语言库迁移至基于 OpenJDK 的方法,来为开发者创建一个通用代码库(common code base)。长久以来,谷歌一直和 OpenJDK 社区有长期合作和贡献,我们期望在将来能为 OpenJDK 项目做出更多贡献。」

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现实时二维码扫描功能,可以使用 Android 的 camera2 API 和 Google 的 ZXing 库。 首先,在 AndroidManifest.xml 文件中添加相机和网络权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.INTERNET" /> ``` 然后,在 build.gradle 文件中添加 ZXing 库的依赖项: ```gradle implementation 'com.google.zxing:core:3.4.0' implementation 'com.journeyapps:zxing-android-embedded:3.6.0' ``` 接下来,在布局文件中添加一个 TextureView 组件用于预览相机图像,并在代码中实例化 CameraManager 和 TextureView: ```xml <TextureView android:id="@+id/textureView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` ```java private CameraManager cameraManager; private TextureView textureView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE); textureView = findViewById(R.id.textureView); } ``` 然后,实现 TextureView.SurfaceTextureListener 接口,以在 TextureView 就绪时打开相机,开始预览图像: ```java private String cameraId; private CameraDevice cameraDevice; private Size previewSize; private CaptureRequest.Builder captureRequestBuilder; private CameraCaptureSession cameraCaptureSession; private ImageReader imageReader; private final TextureView.SurfaceTextureListener surfaceTextureListener = new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) { openCamera(); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) { configureTransform(width, height); } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { } }; ``` 在 openCamera() 方法中,获取可用的相机列表并选择一个相机,设置预览尺寸和输出格式,然后打开相机: ```java private void openCamera() { try { CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); assert map != null; previewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), textureView.getWidth(), textureView.getHeight()); imageReader = ImageReader.newInstance(previewSize.getWidth(), previewSize.getHeight(), ImageFormat.YUV_420_888, 2); imageReader.setOnImageAvailableListener(imageReaderListener, backgroundHandler); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { return; } cameraManager.openCamera(cameraId, stateCallback, backgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 在 stateCallback 中处理相机设备的状态,如果打开成功,创建一个 CaptureRequest.Builder 对象,用于构建捕获请求: ```java private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { cameraDevice = camera; createPreviewSession(); } @Override public void onDisconnected(CameraDevice camera) { cameraDevice.close(); cameraDevice = null; } @Override public void onError(CameraDevice camera, int error) { cameraDevice.close(); cameraDevice = null; } }; private void createPreviewSession() { try { SurfaceTexture surfaceTexture = textureView.getSurfaceTexture(); assert surfaceTexture != null; surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); Surface previewSurface = new Surface(surfaceTexture); Surface imageReaderSurface = imageReader.getSurface(); captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureRequestBuilder.addTarget(previewSurface); captureRequestBuilder.addTarget(imageReaderSurface); cameraDevice.createCaptureSession(Arrays.asList(previewSurface, imageReaderSurface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { cameraCaptureSession = session; updatePreview(); } @Override public void onConfigureFailed(CameraCaptureSession session) { } }, backgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 在 updatePreview() 方法中,设置捕获请求的参数并开始预览: ```java private void updatePreview() { try { captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, backgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 最后,在 imageReaderListener 中处理相机输出的图像数据,解码二维码并将结果显示在界面上: ```java private final ImageReader.OnImageAvailableListener imageReaderListener = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireLatestImage(); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); byte[] data = new byte[buffer.remaining()]; buffer.get(data); image.close(); try { PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, previewSize.getWidth(), previewSize.getHeight(), 0, 0, previewSize.getWidth(), previewSize.getHeight(), false); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Result result = new MultiFormatReader().decode(bitmap); runOnUiThread(() -> textView.setText(result.getText())); } catch (Exception e) { e.printStackTrace(); } } }; ``` 完整的代码示例可以参考 https://github.com/edwardw1987/Camera2QRCodeScanner 。注意,在实际开发中,可能需要进行更多的错误处理和性能优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值