【问题标题】:Android M - MediaRecorder start failedAndroid M - MediaRecorder 启动失败
【发布时间】:2016-06-06 07:04:32
【问题描述】:

Samsung Galaxy S6 edge 6.0.1 运行良好,所以 Android M 可能不是这里的因素。

首先,Android 6.0+ 权限被授予,所以不是这样的。

这里是:

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        //нужно проверять пермишны
        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED || 
        ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.RECORD_AUDIO)
        != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.ACCESS_NETWORK_STATE)
        != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.INTERNET)
        != PackageManager.PERMISSION_GRANTED) {


                ActivityCompat.requestPermissions(MainActivity.this,
                   new String[]{Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO,Manifest.permission.INTERNET,Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        PERMISSIONS_REQUEST);           

        }
    }

我已经在其他设备上测试了我的应用程序,它运行良好,但在 Nexus 5(锤头)上,当调用 MediaRecorder.start() 时出现错误,我不知道该怎么做.

堆栈跟踪很简单:

java.lang.RuntimeException: start failed.
    at android.media.MediaRecorder.start(Native Method)
    at com.vladdrummer.headsup.ScreenVideoRecorder.record(ScreenVideoRecorder.java:94)

所以,没有太多的信息。这是代码,但请记住,它适用在其他设备上

private  Camera camera;
...
 camera.setPreviewDisplay(holder);
                  camera.startPreview();
                  isPrepared = prepareVideoRecorder();
..
    private boolean prepareVideoRecorder() {
        try{

        camera.unlock();

        mediaRecorder = new MediaRecorder();

        mediaRecorder.setCamera(camera);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mediaRecorder.setProfile(CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH));
        String path = A.getRawGameVideoPath();//4 debug purposes
        mediaRecorder.setOutputFile(path);
        mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
        }
        catch (Exception e){
            e.printStackTrace();
            return false;
        }
        try {
          mediaRecorder.prepare();
        } catch (Exception e) {
          e.printStackTrace();
          release();
          return false;
        }
        return true;
      }

      public void record(){
          if (isPrepared){        
          mediaRecorder.start(); // Here where it crashes on Android M
          }
      }

当然,它也可能在其他设备上崩溃,我只在 3 台设备上测试过

【问题讨论】:

    标签: android mediarecorder android-mediarecorder


    【解决方案1】:

    对于 android M 您需要添加运行时权限,例如 Camera,Audio 试试这个可能对你有帮助

    private static final int MY_PERMISSIONS_REQUEST = 11;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (mContext.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO},
                MY_PERMISSIONS_REQUEST);
    } else {
        Log.d("TAG", "Already granted access");
        initializeView(v);
    }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.d("TAG", "Permission Granted");
                initializeView(v);
            } else {
                Log.d("TAG", "Permission Failed");
                Toast.makeText(getActivity().getBaseContext(), "You must allow permission record audio to your mobile device.", Toast.LENGTH_SHORT).show();
                getActivity().finish();
            }
        }
        // Add additional cases for other permissions you may have asked for
    }
      }
    

    【讨论】:

    • 对不起,不是这样,我已经在运行时授予了该权限
    【解决方案2】:

    试试这个:

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED || 
        ContextCompat.checkSelfPermission(this,
                Manifest.permission.RECORD_AUDIO)
        != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_NETWORK_STATE)
        != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(this,
                Manifest.permission.INTERNET)
        != PackageManager.PERMISSION_GRANTED) {
    
                ActivityCompat.requestPermissions(this,
                   new String[]{Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO,Manifest.permission.INTERNET,Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        0);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 2015-07-30
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 2012-07-30
      • 2012-06-30
      • 1970-01-01
      相关资源
      最近更新 更多