Android 7.1.1下如何通过Intent启动前置摄像头?求帮助
Hey there! Let's figure out why your front camera intent isn't working on Android 7.1.1 and fix it. The main issue with your current code is that those extra flags you're using (like android.intent.extras.CAMERA_FACING) aren't universally supported across all camera apps—many device manufacturers have their own camera implementations that ignore these non-standard extras.
Here's a revised approach that improves compatibility, plus key checks you need to make:
Step 1: Verify Permissions & Device Capabilities
First, make sure your app has the necessary permissions and the device actually has a front camera:
Add Manifest Permissions
Add these lines to your AndroidManifest.xml:
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.front" android:required="false" /> <!-- FileProvider setup (required for Android 7.0+) --> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
Create File Paths Configuration
Create res/xml/file_paths.xml to define where your app can store images:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="camera_images" path="Pictures/" /> </paths>
Check Dynamic Permissions (Android 6.0+)
Before launching the camera, confirm you've been granted the required permissions:
private static final int PERMISSION_REQUEST_CODE = 100; private static final int CAMERA_PHOTO_REQUEST_CODE = 200; private void checkPermissionsAndLaunchCamera() { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); return; } launchFrontCamera(); }
Step 2: Revised Camera Intent Code
Use this code to launch the front camera with better compatibility across devices. We'll include multiple common extra flags to cover different camera app implementations:
private void launchFrontCamera() { // Check if front camera exists PackageManager pm = getActivity().getPackageManager(); if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) { Toast.makeText(getActivity(), "No front camera available on this device", Toast.LENGTH_SHORT).show(); return; } Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // Add multiple front camera flags to cover different app support intent.putExtra("android.intent.extras.CAMERA_FACING", android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT); intent.putExtra("lens_facing_front", 1); intent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true); // Set up output file (same as your original code) mFile = Utils.getVisitorImage(); Uri imageUri = FileProvider.getUriForFile( getActivity(), getActivity().getPackageName() + ".fileprovider", mFile ); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // Ensure there's an app to handle the intent if (intent.resolveActivity(pm) != null) { startActivityForResult(intent, CAMERA_PHOTO_REQUEST_CODE); } else { Toast.makeText(getActivity(), "No camera app found to handle the request", Toast.LENGTH_SHORT).show(); } }
Key Notes for Android 7.1.1
- FileProvider Mandatory: Android 7.0+ blocks
file://URIs in intents to other apps, so using FileProvider is non-negotiable for saving photos to your app's storage. - Camera App Compatibility: Unfortunately, some camera apps still won't respect the front camera flags. If this approach fails, you might need to use the Camera2 API or CameraX (Jetpack library) to directly control the front camera instead of relying on third-party camera apps.
- Handle Permission Results: Don't forget to override
onRequestPermissionsResultto launch the camera once permissions are granted:@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { launchFrontCamera(); } else { Toast.makeText(getActivity(), "Permissions are required to use the camera", Toast.LENGTH_SHORT).show(); } } }
内容的提问来源于stack exchange,提问作者kai hello

