5

音を 1 秒間録音し、録音した音から最大振幅を読み取るアプリを作成しようとしています。これは私がこれまでに持っているものですが、アプリがクラッシュし、その理由がわかりません。

これは私の 2 番目のアクティビティで、「記録」ボタンを押した後、最初のアクティビティから呼び出しています。エミュレーターと電話でアプリがクラッシュします。

package radu.soundSampler;

import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import android.media.MediaRecorder;

public class DisplayMessageActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Intent intent = getIntent();
    //String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    MediaRecorder rec = new MediaRecorder();
    rec.setAudioSource(MediaRecorder.AudioSource.MIC);
    rec.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
    rec.setOutputFile("/newRecording");
    rec.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

    try {
        rec.prepare();
    } catch (IllegalStateException e) {

    } catch (IOException o) {

    }
    rec.start();
            for(int i=0;i<100000;i++);
    rec.stop();
    int rezultat = rec.getMaxAmplitude();

    TextView textView = new TextView(this);
    textView.setTextSize(40);

    textView.setText(Integer.toString(rezultat));

    setContentView(textView);
}

}

私のコンピューターの(更新された)エラーログには次のように書かれています:

08-18 13:30:07.968: E/MediaRecorder(687): start called in an invalid state: 4
08-18 13:30:07.968: D/AndroidRuntime(687): Shutting down VM
08-18 13:30:07.968: W/dalvikvm(687): threadid=1: thread exiting with uncaught exception (group=0x40015560)
08-18 13:30:07.978: E/AndroidRuntime(687): FATAL EXCEPTION: main
08-18 13:30:07.978: E/AndroidRuntime(687): java.lang.RuntimeException: Unable to start activity ComponentInfo{radu.soundSampler/radu.soundSampler.DisplayMessageActivity}: java.lang.IllegalStateException
08-18 13:30:07.978: E/AndroidRuntime(687):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
08-18 13:30:07.978: E/AndroidRuntime(687):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-18 13:30:07.978: E/AndroidRuntime(687):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-18 13:30:07.978: E/AndroidRuntime(687):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-18 13:30:07.978: E/AndroidRuntime(687):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-18 13:30:07.978: E/AndroidRuntime(687):  at android.os.Looper.loop(Looper.java:123)
08-18 13:30:07.978: E/AndroidRuntime(687):  at android.app.ActivityThread.main(ActivityThread.java:3683)
08-18 13:30:07.978: E/AndroidRuntime(687):  at java.lang.reflect.Method.invokeNative(Native Method)
08-18 13:30:07.978: E/AndroidRuntime(687):  at java.lang.reflect.Method.invoke(Method.java:507)
08-18 13:30:07.978: E/AndroidRuntime(687):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-18 13:30:07.978: E/AndroidRuntime(687):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-18 13:30:07.978: E/AndroidRuntime(687):  at dalvik.system.NativeStart.main(Native Method)
08-18 13:30:07.978: E/AndroidRuntime(687): Caused by: java.lang.IllegalStateException
08-18 13:30:07.978: E/AndroidRuntime(687):  at android.media.MediaRecorder.start(Native Method)
08-18 13:30:07.978: E/AndroidRuntime(687):  at radu.soundSampler.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:29)
08-18 13:30:07.978: E/AndroidRuntime(687):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-18 13:30:07.978: E/AndroidRuntime(687):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-18 13:30:07.978: E/AndroidRuntime(687):  ... 11 more

エミュレーターがマイクを「実行」できないのではないかと思ったので.apk、携帯電話にインストールしましたが、そこでもクラッシュしました。何が問題なのかわからないので、助けてください、またはヒントを教えてください。

よろしくお願いします!

もう 1 つのスタック トレースです。リクエストしたものです。私は catch ステートメントで使用したo.printStackTrace()and e.printStackTrace()、それがあなたが私に求めたものであることを願っています:

08-18 14:06:11.908: W/System.err(811): java.io.FileNotFoundException: /newRecording (Read-only file system)
08-18 14:06:11.908: W/System.err(811):  at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
08-18 14:06:11.908: W/System.err(811):  at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
08-18 14:06:11.918: W/System.err(811):  at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
08-18 14:06:11.918: W/System.err(811):  at java.io.FileOutputStream.<init>(FileOutputStream.java:165)
08-18 14:06:11.918: W/System.err(811):  at java.io.FileOutputStream.<init>(FileOutputStream.java:144)
08-18 14:06:11.918: W/System.err(811):  at android.media.MediaRecorder.prepare(MediaRecorder.java:533)
08-18 14:06:11.918: W/System.err(811):  at radu.soundSampler.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:23)
08-18 14:06:11.918: W/System.err(811):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-18 14:06:11.918: W/System.err(811):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-18 14:06:11.918: W/System.err(811):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-18 14:06:11.918: W/System.err(811):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-18 14:06:11.918: W/System.err(811):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-18 14:06:11.918: W/System.err(811):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-18 14:06:11.918: W/System.err(811):  at android.os.Looper.loop(Looper.java:123)
08-18 14:06:11.918: W/System.err(811):  at android.app.ActivityThread.main(ActivityThread.java:3683)
08-18 14:06:11.918: W/System.err(811):  at java.lang.reflect.Method.invokeNative(Native Method)
08-18 14:06:11.928: W/System.err(811):  at java.lang.reflect.Method.invoke(Method.java:507)
08-18 14:06:11.928: W/System.err(811):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-18 14:06:11.928: W/System.err(811):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-18 14:06:11.928: W/System.err(811):  at dalvik.system.NativeStart.main(Native Method)
08-18 14:06:11.928: E/MediaRecorder(811): start called in an invalid state: 4
08-18 14:06:11.928: D/AndroidRuntime(811): Shutting down VM
08-18 14:06:11.928: W/dalvikvm(811): threadid=1: thread exiting with uncaught exception (group=0x40015560)
08-18 14:06:11.948: E/AndroidRuntime(811): FATAL EXCEPTION: main
08-18 14:06:11.948: E/AndroidRuntime(811): java.lang.RuntimeException: Unable to start activity ComponentInfo{radu.soundSampler/radu.soundSampler.DisplayMessageActivity}: java.lang.IllegalStateException
08-18 14:06:11.948: E/AndroidRuntime(811):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
08-18 14:06:11.948: E/AndroidRuntime(811):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-18 14:06:11.948: E/AndroidRuntime(811):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-18 14:06:11.948: E/AndroidRuntime(811):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-18 14:06:11.948: E/AndroidRuntime(811):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-18 14:06:11.948: E/AndroidRuntime(811):  at android.os.Looper.loop(Looper.java:123)
08-18 14:06:11.948: E/AndroidRuntime(811):  at android.app.ActivityThread.main(ActivityThread.java:3683)
08-18 14:06:11.948: E/AndroidRuntime(811):  at java.lang.reflect.Method.invokeNative(Native Method)
08-18 14:06:11.948: E/AndroidRuntime(811):  at java.lang.reflect.Method.invoke(Method.java:507)
08-18 14:06:11.948: E/AndroidRuntime(811):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-18 14:06:11.948: E/AndroidRuntime(811):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-18 14:06:11.948: E/AndroidRuntime(811):  at dalvik.system.NativeStart.main(Native Method)
08-18 14:06:11.948: E/AndroidRuntime(811): Caused by: java.lang.IllegalStateException
08-18 14:06:11.948: E/AndroidRuntime(811):  at android.media.MediaRecorder.start(Native Method)
08-18 14:06:11.948: E/AndroidRuntime(811):  at radu.soundSampler.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:30)
08-18 14:06:11.948: E/AndroidRuntime(811):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-18 14:06:11.948: E/AndroidRuntime(811):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-18 14:06:11.948: E/AndroidRuntime(811):  ... 11 more
08-18 14:06:14.181: I/Process(811): Sending signal. PID: 811 SIG: 9
4

7 に答える 7

2

使用するsetOutoutFile(getExternalFilesDir().getAbsolutePath() + "/newRecording")

マニフェストにこの権限があることを確認してください

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

ビジーウェイトループを実行しないでください。タイマーを使用します。

準備の例外を無視しないでください。

于 2012-08-22T16:58:43.403 に答える
1

まず、書き込みが許可されている場所にレコードを配置する必要があります。

File parent = getContext().getFilesDir();
File recordFile = new File(parent, "newRecording");

正しいスタートです。(他にもあります)

于 2012-08-27T09:24:06.497 に答える
1

この方法で試してみてください.....

    int rezultat = 0;   

try {
        rec.prepare();

        rec.start();

        TimeUnit.SECONDS.sleep(1);  

        rec.stop();

    } catch (IllegalStateException e) {

    } catch (IOException o) {

    } catch (InterruptedException e) {      

    }

     rezultat = rec.getMaxAmplitude();
于 2012-08-25T10:00:25.437 に答える
0

onCreate()メソッドで例外がスローされるため、アクティビティがクラッシュします。このような状況は絶対に避けてください。別のスレッドからprepare()メソッド(またはアクティビティの初期化に純粋に関連していないメソッド)を呼び出し、常にcatchブロックでデバッグメッセージを表示します。

経験則として、空のcatch{}ブロックを記述しないでください。後でいつも後悔するでしょう(私を信じて)

于 2012-08-25T08:32:38.203 に答える
0

を使用して試行しているため、ルート ファイル システムにファイルを作成できませんrec.setOutputFile("/newRecording")。一時ファイルを作成し、そこに書き込みます。プライベート ファイル ディレクトリgetFilesDir()および関連を取得するメソッドを確認することをお勧めします。

取得した例外は、まさにこれFileNotFoundExceptionを示しています。 が発生し、prepare()呼び出しが失敗したことが示されます。したがって、あなたMediaRecoderは準備ができておらずstart()、間違った状態にあるのでできません。

別のコメント: 記録を停止する前に 1 秒待機するには、ループ カウントThread.sleep()ではなく and を使用します。for次に、何らかの方法で UI スレッドをブロックすると UI が遅くなる可能性があり、最悪の場合、Android が ANR 例外でアプリケーションを強制終了する可能性があるため、バックグラウンド スレッドで実行してください。

于 2012-08-22T14:54:41.140 に答える
0

サルート!

Android で正しいディレクトリを使用していないことが原因である可能性があります。ご覧のとおり\、ルート ディレクトリを使用していますが、もちろん読み取り専用です。

これを解決するには、次のように外部ストレージ パスをファイルに追加します。

String externalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;

// Your code here

rec.setOutputFile(externalStoragePath + "newRecording");

これで問題は解決するはずです。うまくいかない場合はコメントを残してください。

PS ブレークポイントを一番上に置き、onCreate()アプリをデバッグして、失敗した場所を正確に確認します。

于 2012-08-27T11:25:44.793 に答える