【问题标题】:Android: Media Recorder cannot startAndroid:媒体记录器无法启动
【发布时间】:2016-10-19 09:00:52
【问题描述】:

我有问题。我目前正在开发一个只记录我的声音而不是来自手机的声音的应用程序。我读到“MediaRecorder.AudioSource.VOICE_UPLINK”可以完成这项任务。
这是我的java代码。

package com.khagendra.zip_it;

import android.media.MediaRecorder;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import java.io.IOException;


public class Settings extends Fragment {
    Button start,stop;
   boolean fingerDown = false;
    private Thread thread;
    private int lastLevel;
    public Settings(){

    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.settings_activity,container,false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);


        start = (Button) view.findViewById(R.id.bstart);
        stop = (Button) view.findViewById(R.id.bstop);
        stop.setEnabled(false);
        final SoundMeter sm = new SoundMeter();

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("level","started");
                sm.start();
                sm.getAmplitude();
            }
        });

        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setSelected(false);
                start.setEnabled(true);
                stop.setEnabled(false);
                Log.d("level","stopped");
                sm.stop();
            }
        });


    }
    public class SoundMeter {

        private MediaRecorder mRecorder = null;

        public void start() {
            if (mRecorder == null) {
                mRecorder = new MediaRecorder();
                mRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_UPLINK);
                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mRecorder.setOutputFile("/dev/null");

                try {
                    mRecorder.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                       mRecorder.start();
                }catch (Throwable t){
                    t.printStackTrace();
                    Log.d("level_error",""+t);

                }
            }
        }

        public void stop() {
            thread.interrupt();
            thread = null;

            if (mRecorder != null) {
                mRecorder.stop();
                mRecorder.release();
                mRecorder = null;
            }
        }

        public void getAmplitude() {



            thread = new Thread(new Runnable() {
                public void run() {
                    while(thread != null && !thread.isInterrupted()){
                        //Let's make the thread sleep for a the approximate sampling time
                        try{Thread.sleep(75);}catch(InterruptedException ie){ie.printStackTrace();}
                        //readAudioBuffer();//After this call we can get the last value assigned to the lastLevel variable

                        getActivity().runOnUiThread(new Runnable() {

                            @Override
                            public void run() {

                                if (mRecorder != null) {
                                          lastLevel = mRecorder.getMaxAmplitude();
                                    if(lastLevel>2000)
                                    Log.d("level", "medium:" + lastLevel);

                                }

                            }
                        });
                    }
                }
            });
            thread.start();



        }
    }
}

这是我的 logcat 输出:

06-17 18:52:37.994  12129-12129/com.khagendra.zip_it D/level﹕ started
06-17 18:52:38.034  12129-12129/com.khagendra.zip_it E/MediaRecorder﹕ start failed: -2147483648
06-17 18:52:38.054  12129-12129/com.khagendra.zip_it W/System.err﹕ java.lang.RuntimeException: start failed.
06-17 18:52:38.064  12129-12129/com.khagendra.zip_it W/System.err﹕ at android.media.MediaRecorder.start(Native Method)
06-17 18:52:38.064  12129-12129/com.khagendra.zip_it W/System.err﹕ at com.khagendra.zip_it.Settings$SoundMeter.start(Settings.java:103)
06-17 18:52:38.064  12129-12129/com.khagendra.zip_it W/System.err﹕ at com.khagendra.zip_it.Settings$1.onClick(Settings.java:69)
06-17 18:52:38.064  12129-12129/com.khagendra.zip_it W/System.err﹕ at android.view.View.performClick(View.java:4432)
06-17 18:52:38.064  12129-12129/com.khagendra.zip_it W/System.err﹕ at android.view.View$PerformClick.run(View.java:18338)
06-17 18:52:38.064  12129-12129/com.khagendra.zip_it W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:725)
06-17 18:52:38.064  12129-12129/com.khagendra.zip_it W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92)
06-17 18:52:38.064  12129-12129/com.khagendra.zip_it W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
06-17 18:52:38.064  12129-12129/com.khagendra.zip_it W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5283)
06-17 18:52:38.064  12129-12129/com.khagendra.zip_it W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
06-17 18:52:38.074  12129-12129/com.khagendra.zip_it W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
06-17 18:52:38.074  12129-12129/com.khagendra.zip_it W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
06-17 18:52:38.074  12129-12129/com.khagendra.zip_it W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
06-17 18:52:38.074  12129-12129/com.khagendra.zip_it W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
06-17 18:52:38.074  12129-12129/com.khagendra.zip_it D/level_error﹕ java.lang.RuntimeException: start failed.

我知道有些人会建议使用“MediaRecorder.AudioSource.MIC”。所以,我试过了。它工作正常,但我希望“VOICE_UPLINK”或“VOICE_DOWNLINK”工作。 我们将不胜感激任何形式的帮助。

附加信息:我正在考虑在通话期间实施相同的操作,以便我只能录制我的声音。但现在我希望它能够工作。

【问题讨论】:

    标签: android crash mediarecorder voice-recording


    【解决方案1】:

    此功能需要CAPTURE_AUDIO_OUTPUT 的权限。但此权限仅保留给系统应用程序,第三方应用程序不能使用。这意味着,只要您的应用程序不是系统应用程序,您就无法使用它。使您的应用成为系统应用将需要一些复杂的东西和有根设备/只能在有根设备上工作。

    来自文档:

    VOICE_DOWNLINK
    

    从 VOICE_DOWNLINK 源捕获需要 CAPTURE_AUDIO_OUTPUT 权限。此权限仅供系统组件使用,第三方应用程序不可用。

    VOICE_UPLINK
    

    从 VOICE_UPLINK 源捕获需要 CAPTURE_AUDIO_OUTPUT 权限。此权限仅供系统组件使用,第三方应用程序不可用。

    【讨论】:

    • 感谢您指出这一点,但我的手机上安装了来自 Play 商店的用于通话录音的应用程序,它提供了在通话过程中录制麦克风/自己的声音/对方声音的功能。我的手机没有root。知道如何使我的应用程序成为系统应用程序吗?
    • 这只能由用户制作,我猜(!),我没有努力制作系统应用程序。另一种方法是制作自己的 ROM,例如 cyanogenMod。我在过去(几​​年前)也制作了一个类似的应用程序,但诀窍只是通过麦克风进行通常的录音,并通知用户将扬声器调大。
    • 如何让应用成为系统应用:addictivetips.com/mobile/…
    • 您提供的链接要求有根设备。没有root手机就没有办法做到这一点吗?
    • 不,没有 root 是不可能的。如果可能的话,这将是每个可怜的邪恶黑客直接使用您的设备的方法。
    猜你喜欢
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多