Java 无法启动有意图的服务。无法连接到摄像头服务

Java 无法启动有意图的服务。无法连接到摄像头服务,java,android,Java,Android,我真不敢相信为什么这个代码不起作用。我试了好几次都没用,我怎么解决这个问题,你是怎么解决的 xml java(RecorderService类) 导入android.app.Service; 导入android.content.Intent; 导入android.hardware.Camera; 导入android.hardware.Camera.Size; 导入android.media.MediaRecorder; 导入android.os.Environment; 导入android.os

我真不敢相信为什么这个代码不起作用。我试了好几次都没用,我怎么解决这个问题,你是怎么解决的

xml

java(RecorderService类)

导入android.app.Service;
导入android.content.Intent;
导入android.hardware.Camera;
导入android.hardware.Camera.Size;
导入android.media.MediaRecorder;
导入android.os.Environment;
导入android.os.IBinder;
导入android.util.Log;
导入android.view.SurfaceHolder;
导入android.view.SurfaceView;
导入android.widget.Toast;
导入java.io.IOException;
导入java.util.List;
公共类记录器服务扩展服务{
私有静态最终字符串TAG=“RecorderService”;
私人SurfaceView mSurfaceView;
私人地表持有人;
专用静态摄像机;
私有布尔mRecordingStatus;
专用媒体记录器;
@凌驾
public void onCreate(){
mRecordingStatus=false;
mServiceCamera=CameraRecorder.mCamera;
mSurfaceView=CameraRecorder.mSurfaceView;
mSurfaceHolder=CameraRecorder.mSurfaceHolder;
super.onCreate();
}
@凌驾
公共IBinder onBind(意向){
返回null;
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
super.onStartCommand(intent、flags、startId);
如果(mRecordingStatus==false)
startRecording();
返回开始时间;
}
@凌驾
公共空间{
停止录制();
mRecordingStatus=false;
super.ondestory();
}
公共布尔startRecording(){
试一试{
Toast.makeText(getBaseContext(),“录制已开始”,Toast.LENGTH_SHORT.show();
mServiceCamera=Camera.open();
Camera.Parameters params=mServiceCamera.getParameters();
mServiceCamera.setParameters(参数);
Camera.Parameters p=mServiceCamera.getParameters();
最终列表listPreviewSize=p.getSupportedPreviewSizes();
用于(大小:listPreviewSize){
Log.i(标记、字符串、格式(“支持的预览大小(%d,%d)”、Size.width、Size.height);
}
Size previewSize=listPreviewSize.get(0);
p、 setPreviewSize(previewSize.width、previewSize.height);
mServiceCamera.setParameters(p);
试一试{
mServiceCamera.setPreviewDisplay(mSurfaceHolder);
mServiceCamera.startPreview();
}
捕获(IOE异常){
Log.e(标记,e.getMessage());
e、 printStackTrace();
}
mServiceCamera.unlock();
mMediaRecorder=新的MediaRecorder();
mMediaRecorder.setCamera(mServiceCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getPath()+“/video.mp4”);
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
mMediaRecorder.prepare();
mMediaRecorder.start();
mRecordingStatus=true;
返回true;
}捕获(非法状态){
Log.d(标记,例如getMessage());
e、 printStackTrace();
返回false;
}捕获(IOE异常){
Log.d(标记,例如getMessage());
e、 printStackTrace();
返回false;
}
}
公开作废停止录制(){
Toast.makeText(getBaseContext(),“录制已停止”,Toast.LENGTH_SHORT.show();
试一试{
mServiceCamera.reconnect();
}捕获(IOE异常){
e、 printStackTrace();
}
mMediaRecorder.stop();
mMediaRecorder.reset();
mServiceCamera.stopReview();
mMediaRecorder.release();
mServiceCamera.release();
mServiceCamera=null;
}
}
安卓清单


我相信您没有请求运行时权限

private int REQUEST_CODE_PERMISSIONS = 101;
private final String[] REQUIRED_PERMISSIONS = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.RECORD_AUDIO,
        Manifest.permission.CAMERA
};

 if (allPermissionsGranted()) {
    startCamera(); //start camera if permission has been granted by user
} else {
    ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS);
}
调用permission上下文

 private boolean allPermissionsGranted(){

    for(String permission : REQUIRED_PERMISSIONS){
        if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
            return false;
        }
    }
    return true;
}
如果未授予许可

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    if(requestCode == REQUEST_CODE_PERMISSIONS){
        if(allPermissionsGranted()){
            startCamera();
        } else{
            Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
}

您需要在gradle文件中实现摄影机依赖关系。

您是否已请求运行时权限?对于摄像机和音频?@ADM no,我怎么能这样做?非常感谢你,我的朋友,你在解决方案中起了很大作用。如果我的问题真的帮助了你,请单击勾选按钮。。。。让人们知道它解决了,谢谢你…我是这个网站的新手,所以我不知道勾号按钮在哪里,它在哪里?
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.camerarecorder">


    <uses-permission android:name="android.permission.RECORD_VIDEO" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

    <application android:icon="@drawable/ic_launcher_background"
        android:label="@string/app_name">
        <activity android:name="com.example.camerarecorder.CameraRecorder"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name="com.example.camerarecorder.RecorderService"
            android:enabled="true"
            />
    </application>

</manifest>
private int REQUEST_CODE_PERMISSIONS = 101;
private final String[] REQUIRED_PERMISSIONS = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.RECORD_AUDIO,
        Manifest.permission.CAMERA
};

 if (allPermissionsGranted()) {
    startCamera(); //start camera if permission has been granted by user
} else {
    ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS);
}
 private boolean allPermissionsGranted(){

    for(String permission : REQUIRED_PERMISSIONS){
        if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
            return false;
        }
    }
    return true;
}
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    if(requestCode == REQUEST_CODE_PERMISSIONS){
        if(allPermissionsGranted()){
            startCamera();
        } else{
            Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
}