在配置文件(manifest file)中声明activity的一点理解

配置文件的主要的任务是通知系统程序使用了哪些组件。
下面的是在配置文件中声明activity的一点解释。

<?xml的version = "1.0" encoding = "utf-8" ?> 
<manifest ... > 
    <application  android:icon = "@drawable/app_icon.png" ... > 
        <activity  android:name = "com.example.project.ExampleActivity" 
                  android:label = "@string/example_label" ... > 
        </activity> 
        ... 
    </application> 
</manifest>
  • 在application这个元素中,android:icon属性指定了识别该应用程序的图标来源。
  • 在activity这个元素中,android:name属性指定了Activity子类的完全正确类名,android:label属性是为这个activity指定一个用户可见标签的字符串。
    你必须以下面这样的方式来声明应用程序的组件:

    <activity>元素来声明activities
    <service> 元素来声明services
    <receiver> 元素来声明broadcast receivers
    <provider> 元素来声明content providers
    包含在你的程序中,但是没有在配置文件中声明的activities,services,content providers是不能被系统所识别的,因此也无法运行。但是, broadcast receiver既可以在配置文件中声明,也可以在代码中被动态创建(作为 BroadcastReceiver 对象) 并且通过调用 registerReceiver() 注册于系统中。

首先,你需要请求相机权限,可以使用以下代码: ```java private static final int REQUEST_CAMERA_PERMISSION = 1; if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA }, REQUEST_CAMERA_PERMISSION); } ``` 现在,让我们创建一个布局文件来显示我们的相机预览和拍照按钮: ```xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextureView android:id="@+id/texture_view" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:id="@+id/capture_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|bottom" android:text="Capture" /> </FrameLayout> ``` 接下来,我们需要配置相机并显示相机预览。在 onCreate 方法,我们可以使用以下代码进行配置: ```java private CameraDevice cameraDevice; private Size previewSize; private TextureView textureView; private CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { cameraDevice = camera; createCameraPreview(); } @Override public void onDisconnected(CameraDevice camera) { cameraDevice.close(); } @Override public void onError(CameraDevice camera, int error) { cameraDevice.close(); cameraDevice = null; } }; private void openCamera() { CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { String cameraId = manager.getCameraIdList()[0]; CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); previewSize = map.getOutputSizes(SurfaceTexture.class)[0]; if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { manager.openCamera(cameraId, stateCallback, null); } } catch (CameraAccessException e) { e.printStackTrace(); } } private void createCameraPreview() { try { SurfaceTexture texture = textureView.getSurfaceTexture(); texture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); Surface surface = new Surface(texture); final CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(surface); cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { if (cameraDevice == null) { return; } try { CaptureRequest request = builder.build(); session.setRepeatingRequest(request, null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession session) { } }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textureView = findViewById(R.id.texture_view); openCamera(); } ``` 现在,我们已经成功地配置了相机并显示了相机预览。接下来,我们需要实现拍照功能。在 MainActivity ,我们可以使用以下代码实现拍照: ```java private static final int REQUEST_IMAGE_CAPTURE = 2; private void takePicture() { if (cameraDevice == null) { return; } CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraDevice.getId()); Size[] jpegSizes = null; if (characteristics != null) { jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) .getOutputSizes(ImageFormat.JPEG); } int width = 640; int height = 480; if (jpegSizes != null && jpegSizes.length > 0) { width = jpegSizes[0].getWidth(); height = jpegSizes[0].getHeight(); } ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1); List<Surface> outputSurfaces = new ArrayList<>(2); outputSurfaces.add(reader.getSurface()); outputSurfaces.add(new Surface(textureView.getSurfaceTexture())); final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); captureBuilder.addTarget(reader.getSurface()); captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); int rotation = getWindowManager().getDefaultDisplay().getRotation(); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation)); ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = null; try { image = reader.acquireLatestImage(); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.capacity()]; buffer.get(bytes); save(bytes); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (image != null) { image.close(); } } } private void save(byte[] bytes) throws IOException { OutputStream output = null; try { File file = new File(Environment.getExternalStorageDirectory() + "/pic.jpg"); output = new FileOutputStream(file); output.write(bytes); } finally { if (output != null) { output.close(); } } } }; reader.setOnImageAvailableListener(readerListener, null); final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); Toast.makeText(MainActivity.this, "Saved:" + Environment.getExternalStorageDirectory() + "/pic.jpg", Toast.LENGTH_LONG).show(); createCameraPreview(); } }; cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { try { session.capture(captureBuilder.build(), captureListener, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession session) { } }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private int getOrientation(int rotation) { return (ORIENTATIONS.get(rotation) + sensorOrientation + 270) % 360; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textureView = findViewById(R.id.texture_view); Button captureButton = findViewById(R.id.capture_button); captureButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { takePicture(); } }); openCamera(); } ``` 现在,我们已经成功地实现了拍照功能并将图像保存到设备上。接下来,我们可以使用 RecyclerView 显示所有拍摄的照片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值