关于在后台服务中开始录音的ANR

时间:2016-06-19 06:15:43

标签: android multithreading

我正在尝试创建一个在后台录制音频的应用。我为此目的使用Service类。由于我不想阻止UI Thread,因此我在Service类中创建了HandlerThread来执行录制操作。但是,当我尝试运行Service时,我的应用会抛出ANR (Application Not Responding) error。我无法弄清楚我的UI Thread是如何被阻止的。另外值得一提的是我创建了一个在我的UI线程上运行的CountUp Timer。

这是我的代码:

public class AudioRecorderService extends Service {
    private Looper mLooper;
    private AudioRecorderHandler mAudioRecorderHandler;
    private MediaRecorder mAudioRecorder;


    public AudioRecorderService() {
    }


    private final class AudioRecorderHandler extends Handler {

        private String fileName;

        public AudioRecorderHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {

            fileName = Environment.getDataDirectory().getAbsolutePath() + "/" + "test.mp4";

            mAudioRecorder = new MediaRecorder();
            mAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mAudioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            mAudioRecorder.setAudioEncodingBitRate(256);
            mAudioRecorder.setAudioChannels(1);
            mAudioRecorder.setAudioSamplingRate(44100);
            mAudioRecorder.setOutputFile(fileName);

            try {
                mAudioRecorder.prepare();
                mAudioRecorder.start();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Toast.makeText(this, "Recording Started", Toast.LENGTH_LONG).show();

        Message msg = mAudioRecorderHandler.obtainMessage();
        msg.arg1 = startId;

        mAudioRecorderHandler.sendMessage(msg);

        return START_REDELIVER_INTENT;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {

        android.os.Debug.waitForDebugger();

        HandlerThread thread = new HandlerThread("AudioRecorder", Process.THREAD_PRIORITY_BACKGROUND);
        thread.start();

        mLooper = thread.getLooper();
        mAudioRecorderHandler = new AudioRecorderHandler(mLooper);
    }

    @Override
    public void onDestroy() {

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

        Toast.makeText(this, "Recording Done", Toast.LENGTH_LONG).show();

        mLooper.quit();
        mLooper.getThread().interrupt();

    }
}

这是我的错误日志:

   06-19 16:22:15.971 509-551/? E/InputDispatcher: channel '41c32190 com.example.vaibhav.phrasesapp/com.example.vaibhav.phrasesapp.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
06-19 16:22:17.025 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.026 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.026 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.026 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.026 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.026 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.026 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.026 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.026 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.026 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.026 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.027 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.027 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.027 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.027 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.027 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.027 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.027 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.027 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.027 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.027 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.028 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.028 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.028 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.028 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.028 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.028 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.028 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.029 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.029 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.029 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.029 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.029 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.029 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.029 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.030 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.030 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.030 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.030 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.030 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.030 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.030 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.030 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.031 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.032 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.032 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.032 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.032 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:17.032 509-536/? E/FWKEXT: Enter GetCurrentOP
06-19 16:22:19.172 9787-9791/? E/Trace: error opening trace file: No such file or directory (2)
06-19 16:22:19.176 9787-9793/? E/jdwp: jdwp::setsockopt(SO_SNDTIMEO)
06-19 16:22:19.176 9787-9793/? E/jdwp: jdwp::setsockopt(SO_RCVTIMEO)
06-19 16:22:19.264 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.util.ArrayMap', referenced from method com.android.tools.fd.runtime.MonkeyPatcher.monkeyPatchExistingResources
06-19 16:22:19.266 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.util.ArrayMap', referenced from method com.android.tools.fd.runtime.MonkeyPatcher.pruneResourceCache
06-19 16:22:19.292 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.295 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.295 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.media.session.MediaController', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.296 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.widget.Toolbar', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.319 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.app.ActivityManager$TaskDescription', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.333 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.app.SharedElementCallback', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.337 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.340 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.transition.TransitionManager', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.349 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.app.SharedElementCallback', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.361 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.app.assist.AssistContent', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.368 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.view.SearchEvent', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:19.374 9797-9797/com.example.vaibhav.phrasesapp E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.vaibhav.phrasesapp.MainActivity.access$super
06-19 16:22:27.799 803-1055/? E/CellLocation: create GsmCellLocation
06-19 16:22:27.802 803-1055/? E/CellLocation: create GsmCellLocation
06-19 16:22:28.446 595-595/? E/wpa_supplicant: Sorted scan results
06-19 16:22:28.446 595-595/? E/wpa_supplicant: 00:17:7c:3a:59:56 freq=2437 qual=0 noise=0 level=-66 flags=0xb
06-19 16:22:28.446 595-595/? E/wpa_supplicant: IEs
06-19 16:22:28.446 595-595/? E/wpa_supplicant: 000d2a2a2a2a76697275732a2a2a2a010882848b960c1218240301062a010032043048606c30140100000fac020100000fac020100000fac020000dd180050f2020101000003a4000027a4000042435e0062322f00dd0600e04c020160
06-19 16:22:28.446 595-595/? E/wpa_supplicant: Beacon IEs
06-19 16:22:28.446 595-595/? E/wpa_supplicant: 000d2a2a2a2a76697275732a2a2a2a010882848b960c1218240301060504000100002a010432043048606c30140100000fac020100000fac020100000fac020000dd180050f2020101000003a4000027a4000042435e0062322f00dd0600e04c020160
06-19 16:22:28.446 595-595/? E/wpa_supplicant: e4:f4:c6:43:dc:88 freq=2412 qual=0 noise=0 level=-70 flags=0x2b
06-19 16:22:28.446 595-595/? E/wpa_supplicant: IEs
06-19 16:22:28.447 595-595/? E/wpa_supplicant: 00094e4554474541523238010882848b961224486c0301012a010032040c1830602d1aee1117ffff0000010000000000000000000000000c00000000003d160105060000000000000000000000000000000000000030140100000fac040100000fac040100000fac020000dd180050f2020101000003a4000027a4000042435e0062322f000b05040023127a4a0e14000a002c01c800140005001900dd07000c43070000000706455520010d10dda80050f204104a0001101044000102103b0001031047001038833092309218838e48e4f4c643dc881021000d4e4554474541522c20496e632e1023001d4e45544745415220576972656c6573732041636365737320506f696e74102400064a52363135301042000831323334353637381054000800060050f2040001101100144a52363135302028576972656c6573732041502910080002210c103c0001011049000600372a000120
06-19 16:22:28.447 595-595/? E/wpa_supplicant: d0:92:9e:c7:ce:82 freq=2462 qual=0 noise=0 level=-73 flags=0xb
06-19 16:22:28.447 595-595/? E/wpa_supplicant: IEs
06-19 16:22:28.447 595-595/? E/wpa_supplicant: 001157696e646f77732050686f6e6539373139010882848b960c12182403010b0706494e20010d142a010030140100000fac040100000fac040100000fac02000032043048606c2d1a2c011bff000000000000000000000080000000000000000000003d160b0804000000000000000000000000000000000000004a0e14000a00c800c8001400050019007f080100000000000040dd180050f2020101010003a4000027a4000042435e0062322f00dd0900037f01010000ff7fdd7f0050f204104a0001101044000102103b00010010470010d44ca65da82f4caca8ebd26a3866b85b102100094d6963726f736f66741023000757696e646f77731024000a31302e302e3134333637104200013010540008000a0050f20000001011000d57696e646f77732070686f6e651008000211681049000600372a000120dd080050f21102000000dd0e0050f2122b000600d0929ec7ce80dd31506f9a09020200253b0d2200d0929ec7ce8111e8000a0050f2000000001011000d57696e646f77732070686f6e650e0000
06-19 16:22:28.447 595-595/? E/wpa_supplicant: Beacon IEs
06-19 16:22:28.447 595-595/? E/wpa_supplicant: 001157696e646f77732050686f6e6539373139010882848b960c12182403010b050800010000000000002a010030140100000fac040100000fac040100000fac02000032043048606c2d1a2c011bff000000000000000000000080000000000000000000003d160b0804000000000000000000000000000000000000004a0e14000a00c800c8001400050019007f080100000000000040dd180050f2020101010003a4000027a4000042435e0062322f00dd0900037f01010000ff7fdd350050f204104a00011010440001021049000600372a00012010540008000a0050f20000001011000d57696e646f77732070686f6e65dd080050f21102000000dd0e0050f2122b000600d0929ec7ce80dd12506f9a09020200253b030600d0929ec7ce81
06-19 16:22:28.447 595-595/? E/wpa_supplicant: 0c:d2:b5:46:4d:40 freq=2462 qual=0 noise=0 level=-84 flags=0xb
06-19 16:22:28.447 595-595/? E/wpa_supplicant: IEs
06-19 16:22:28.447 595-595/? E/wpa_supplicant: 00064d756b657368010882848b961224486c03010b2a010432040c1830602d1a6e1117ff000000010000000000000000000000000c00000000003d160b0006000000000000000000000000000000000000003e0100dd1a0050f20101000050f20202000050f2020050f20401000050f202dd180050f2020101000003a4000027a4000042435e0062322f004a0e14000a002c01c8001400050019007f0101dd07000c430400000007064d5820010b10
06-19 16:22:28.447 595-595/? E/wpa_supplicant: Beacon IEs
06-19 16:22:28.447 595-595/? E/wpa_supplicant: 00064d756b657368010882848b961224486c03010b32040c18306007064d5820010b143308200102030405060733082105060708090a0b050400010020dd1a0050f20101000050f20202000050f2020050f20401000050f2022a01042d1a6e1117ff000000010000000000000000000000000c00000000003d160b0006000000000000000000000000000000000000004a0e14000a002c01c8001400050019007f0101dd180050f2020101000003a4000027a4000042435e0062322f00dd07000c4304000000
06-19 16:22:28.447 595-595/? E/wpa_supplicant: 0c:d2:b5:3f:b7:04 freq=2447 qual=0 noise=0 level=-87 flags=0xb
06-19 16:22:28.447 595-595/? E/wpa_supplicant: IEs
06-19 16:22:28.453 595-595/? E/wpa_supplicant: 001041697274656c5f5a65726f746f756368010882848b961224486c0301082a010432040c1830602d1a6e1117ff000000010000000000000000000000000c00000000003d16080406000000000000000000000000000000000000003e0100dd1a0050f20101000050f20202000050f2020050f20401000050f202dd180050f2020101000003a4000027a4000042435e0062322f004a0e14000a002c01c8001400050019007f0101dd07000c430400000007064d5820010b10
06-19 16:22:28.461 595-595/? E/wpa_supplicant: WPS: WFA subelement id=0 len=1
06-19 16:22:28.461 595-595/? E/wpa_supplicant: WPS: WFA subelement id=0 len=1
06-19 16:22:28.461 595-595/? E/wpa_supplicant: WPS: WFA subelement id=0 len=1
06-19 16:22:28.461 595-595/? E/wpa_supplicant: WPS: WFA subelement id=0 len=1
06-19 16:22:28.461 595-595/? E/wpa_supplicant: WPS: WFA subelement id=0 len=1
06-19 16:22:28.461 595-595/? E/wpa_supplicant: WPS: WFA subelement id=0 len=1
06-19 16:22:49.020 509-528/? E/ANRManager: writeStringToFile error: /sys/module/mlog/parameters/do_mlog java.io.FileNotFoundException: /sys/module/mlog/parameters/do_mlog: open failed: ENOENT (No such file or directory)
06-19 16:22:49.033 509-528/? E/ANRManager: writeStringToFile error: /sys/kernel/debug/tracing/tracing_on java.io.FileNotFoundException: /sys/kernel/debug/tracing/tracing_on: open failed: ENOENT (No such file or directory)
06-19 16:22:49.034 509-528/? E/ANRManager: writeStringToFile error: /sys/kernel/debug/binder/transaction_log_enable java.io.FileNotFoundException: /sys/kernel/debug/binder/transaction_log_enable: open failed: ENOENT (No such file or directory)
06-19 16:22:49.035 509-528/? E/ANRManager: writeStringToFile error: /sys/module/mlog/parameters/timer_intval java.io.FileNotFoundException: /sys/module/mlog/parameters/timer_intval: open failed: ENOENT (No such file or directory)
06-19 16:22:50.830 509-528/? E/ANRManager: ANR in com.example.vaibhav.phrasesapp
                                           Reason: Executing service com.example.vaibhav.phrasesapp/.AudioRecorderService
                                           Load: 6.93 / 8.93 / 20.67
                                           Android time :[2016-06-19 16:22:50.828] [54834.406]
                                           CPU usage from 16261ms to 0ms ago:
                                             2% 158/adbd: 0.4% user + 1.5% kernel / faults: 1122 minor
                                             0.7% 9563/kworker/0:2: 0% user + 0.7% kernel
                                             0.5% 9653/logcat: 0.2% user + 0.3% kernel
                                             0.3% 509/system_server: 0.3% user + 0% kernel / faults: 43 minor
                                             0.3% 45/bat_thread_kthr: 0% user + 0.3% kernel
                                             0.1% 601/com.android.systemui: 0.1% user + 0% kernel / faults: 14 minor
                                             0.1% 881/com.cleanmaster.boost:service: 0.1% user + 0% kernel / faults: 1 minor
                                             0.1% 53/disp_config_upd: 0% user + 0.1% kernel
                                             0.1% 133/surfaceflinger: 0% user + 0% kernel / faults: 4 minor
                                             0.1% 9797/com.example.vaibhav.phrasesapp: 0% user + 0% kernel / faults: 11 minor
                                             0% 54/mmcqd/0: 0% user + 0% kernel
                                             0% 65/mt_gpufreq: 0% user + 0% kernel
                                             0% 595/wpa_supplicant: 0% user + 0% kernel / faults: 1 minor
                                             0% 665/com.android.phone: 0% user + 0% kernel / faults: 8 minor
                                             0% 4987/com.google.android.apps.maps: 0% user + 0% kernel / faults: 1 minor
                                             0% 7872/kworker/0:0: 0% user + 0% kernel
                                           3.6% TOTAL: 1% user + 2.6% kernel
06-19 16:22:50.832 509-528/? E/ActivityManager: get crashInfo fail.

任何人都可以帮忙?????

2 个答案:

答案 0 :(得分:0)

在路径上创建文件,然后将其传递给播放器

 File root = new File(Environment.getDataDirectory().getAbsolutePath() + "/" + "recordings");
 if (!root.exists()) {
     root.mkdirs();        
    }

 fileName = root.getPath().toString();

如果您正在针对API 23(6.0)进行编译,那么您还可以获得运行时权限。

答案 1 :(得分:0)

“android.os.waitForDebugger()”是什么意思?它将睡眠你的线程(你的主线程),直到附加调试器。

我认为这是问题所在。