質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    13830questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6538questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3712questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • GitHub

    771questions

    GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Androidで録音処理を行うと必ずエラーが出てしまいます。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,124

kiriyaman

score 3

前提・実現したいこと

AndroidstudioでAudiorecordを使用して録音をしようとすると毎回同じエラーが表示されてします。1つのサンプルではなく多くのAudioRecordを使用したソースコードやGithubからダウンロードしたものでも実機のログを確認すると同じエラーが表示されます。
参考にしているアプリでは作動しているのに私が同じことするとエラーが出るということは私のPCのAndroidStudioがおかしいのでしょうか。
同じ現象になったことがある方や解決法がわかる方、原因を推測できる方などがいましたらエラーを無くす協力をお願いいたします。
アプリ自体は立ち上がるのですが録音を開始する動作をするとアプリが落ちてしまいます。
毎回録音を開始するソースコード
audioRec.startRecording();
に問題があると表示されます。

録音を開始するとログに表示されるエラーメッセージ

0-22 02:43:03.501 10965-10965/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: com.test.testfft004, PID: 10965
                                                   java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
                                                       at android.media.AudioRecord.startRecording(AudioRecord.java:989)
                                                       at com.test.testfft004.MainActivity.onClick(MainActivity.java:57)
                                                       at android.view.View.performClick(View.java:5646)
                                                       at android.view.View$PerformClick.run(View.java:22459)
                                                       at android.os.Handler.handleCallback(Handler.java:761)
                                                       at android.os.Handler.dispatchMessage(Handler.java:98)
                                                       at android.os.Looper.loop(Looper.java:156)
                                                       at android.app.ActivityThread.main(ActivityThread.java:6523)
                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831)
10-22 02:43:03.522 10965-10965/? I/Process: Sending signal. PID: 10965 SIG: 9

該当のソースコードの一例

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import org.jtransforms.fft.DoubleFFT_1D;

public class MainActivity extends Activity implements View.OnClickListener {
    /** Called when the activity is first created. */
    final static int SAMPLING_RATE = 44100;
    AudioRecord audioRec = null;
    Button btn = null;
    boolean bIsRecording = false;
    int bufSize;
    final static int FFT_SIZE = 512;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button)findViewById(R.id.button_id);
        btn.setOnClickListener(this);
        // バッファサイズの計算
        bufSize = AudioRecord.getMinBufferSize(
                SAMPLING_RATE,
                AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT);
        if (FFT_SIZE > bufSize) {
            bufSize = FFT_SIZE;
        }

        // AudioRecordの作成
        audioRec = new AudioRecord(
                MediaRecorder.AudioSource.MIC,
                SAMPLING_RATE,
                AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT,
                bufSize);
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        if (v == btn) {
            if (bIsRecording) {
                bIsRecording = false;
            }
            else {
                // 録音開始
                Log.v("AudioRecord", "startRecording");
                audioRec.startRecording();
                bIsRecording = true;
                // 録音スレッド
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        byte buf[] = new byte[bufSize];
                        // TODO Auto-generated method stub
                        // 録音データ読み込み
                        audioRec.read(buf, 0, buf.length);
                        // 録音停止
                        //audioRec.stop();

                        //高速フーリエ変換
                        DoubleFFT_1D fft = new DoubleFFT_1D(FFT_SIZE);
                        double[] FFTdata = new double[FFT_SIZE];
                        for (int i = 0; i < FFT_SIZE; i++) {
                            FFTdata[i] = (double) buf[i];
                        }
                        fft.realForward(FFTdata);
                        double[] dbfs = new double[FFT_SIZE / 2];
                        double max_db = 0;
                        int max_i = 0;
                        for (int i = 0; i < FFT_SIZE / 2; i += 2) {
                            dbfs[i / 2] = (int) (Math.sqrt(Math.pow(FFTdata[i], 2) + Math.pow(FFTdata[i + 1], 2)));
                            if (max_db < dbfs[i / 2]) {
                                max_db = dbfs[i / 2];
                                max_i = i / 2;
                            }

                        }
                        //Log.d("db", "Hz" + (SAMPLING_RATE/ (double) FFT_SIZE)*max_i*2 + "maxdb" + max_db);
                    }
                }).start();
            }
        }
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        audioRec.release();
    }
}

試したこと

多くのサンプルコードを試したがaudioRec.startRecording();で落ちてしまう
Mediarecordでは録音はうまくいった

補足情報(言語/FW/ツール等のバージョンなど)

androidstudio2.3.3

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2017/10/22 09:04

    uninitialized ← 初期化処理入れてる?

    キャンセル

  • kiriyaman

    2017/10/22 22:57

    コメントありがとうございます。uninitializedの初期化処理とはどこで行うものでしょうか?

    キャンセル

回答 2

checkベストアンサー

0

考えられるのは下記の2点です。
・アプリケーションに対して、マイク使用のパーミッションを付与していない。
・端末が指定したSAMPLING_RATEに対応していない。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/23 00:58

    コメントありがとうございます。
    マイクのパーミッションですがandroidManifestに
     <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    の二つを記述しています。
    SAMPLING_RATEですがいくつかの数値で試してみます。

    キャンセル

  • 2017/10/23 01:53

    マニフェストにパーミッションを書いて準備完了になるのは古いバージョンだけです、端末の設定アプリからパーミッションの付与を行なってください。

    キャンセル

  • 2017/10/23 02:23

    端末の設定を変更したらできました!
    本当にありがとうございます!

    キャンセル

0

yora様のコメントのおかげさまで問題が解決しました。
どうやら現在のAndroidStudioのバージョンではManifestにパーミッションを<uses-permission android:name="android.permission.RECORD_AUDIO"/>を付与するだけでは準備完了にはならないので端末の設定アプリからアプリで使用するアプリを選択しマイクの許可をしなければAudioRecordは落ちてしまうみたいです。
もし同じ現象になる方はこちらの方法を試してみてください。
ソースコード自体に端末のマイク設定を許可するものが組み込まれていたらおそらく使用できますが、うまく起動しない場合はこちらの方法を試してみてください。
エミュレータでのテストでもしうまくいかなかった方も設定でマイクが許可されているか試してみてください。
![イメージ説明](6ec9f16eeeb1c5d7095af3a3238dfa4f.png)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/23 10:00

    AndroidStudioのバージョンではなく、Android OSのバージョンですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    取得した画像をgridViewで表示する際に、スレッドを使って高速化したい

    端末内に保存されている画像を取得して、gridViewを使ってサムネイル表示するコードを書きましたが、画像が多くなると、取得に時間がかかり、表示までかなり待たされる状態です。 ス

  • 解決済

    GPS検索の中止処理を実装方法を教えてください

    いつもお世話になっています。 Android で GPS 検索を行うシステムの勉強をしています。 LocationManager の requestLocationUpdate

  • 解決済

    違うクラスでボタンの処理を書く

    Activityの親クラスではないクラスでボタンタップ時の処理を書きたいです。 下のように書いてみたのですが i1.setOnClickListener( new  com

  • 解決済

    画像と文字列を同時に送りたい(PHP->Android)

    前提・実現したいこと サーバ側PHPでDBからSELECTした画像及び文字列を、Android端末に渡したいと考えています。 画像単体の受け渡しには成功したのですが、同時に文字

  • 解決済

    HTTP通信でJSONデータをカラムごとに取得したいです。

    前提・実現したいこと RailsAPIからJSONデータをカラムごとにAndroid側で取得したいです。 取得するデータは以下です。(en_titleカラムの値を取得したいです

  • 解決済

    android opencv で色検出

    私はandroidstudioでアプリ開発を行なっており今opencvを使っています。 フレームの中に入っている緑の色をしている領域の中で一番面積が大きいものを選び出し、その輪郭を

  • 解決済

    android opencvで輪郭描画

    私はandroidstudioでアプリ開発を行っています。 実現したいこと opencvで赤い色を検知して赤色を白に、それ以外を黒にしてそのあとに赤い物の輪郭の中心座標を返した

  • 解決済

    プログレスダイアログ-toastがエラーが起きる

    このサイトを参考にしました。 プログレスダイアログが1.2分表示された後、toastでメッセージ表示させようかと思ったのですが、うまくいきません。一番下に主なコードを示していま

同じタグがついた質問を見る

  • Java

    13830questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6538questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3712questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • GitHub

    771questions

    GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。