Audio Dateien aufzeichnen und abspielen

  • 3 Antworten
  • Letztes Antwortdatum
B

BlupBlup

Ambitioniertes Mitglied
1
Hi ich habe ein Beispiel aus dem Buch "Android 4 Apps entwickeln mit dem Android SDK von Thomas Künneth" genommen und ein wenig verändert.

Mit dieser App kann man Audio Dateien aufnehmen und wieder abspielen.
Wenn ich die aufgenommene Datei im internen Speicher ablege und von dort wieder lade funktioniert die App.
Wenn ich hingegen die aufgenommene Datei im Anwendungsverzeichnis der App ablege und von dort wieder laden möchte funktioniert die App nicht.
Woran liegt das?

Unten ist der komplette Code der App zu sehen, die Manifest Datei und die LogCat Ausgabe.
Ich habe farblich die beiden Stellen hervorgehoben in denen ich die Datei
in den internen Speicher / in das Anwendungsverzeichnis ablege.
Die blau hervorgehobene Variante funktioniert.
Die orange hervorgehobene Variante funktioniert nicht.

Unter Einstellungen -> Apps
habe ich mir die App nach Aufzeichnung der Audiodatei angeschaut
und in der App-Info kann man auch sehen, dass sich auch wirklich Daten
im Anwendungsverzeichnis befinden müssen, da die KB Größe ungleich 0 ist.


RR.java
Code:
package com.thomaskuenneth.rr;

import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;

public class RR extends Activity
{

    private static final String TAG = RR.class.getSimpleName();

    private static enum MODE 
    {
        WAITING, RECORDING, PLAYING
    };

    private MODE mode;
    private RRListAdapter listAdapter;
    private Button b;
    private File currentFile;
    private MediaPlayer player;
    private MediaRecorder recorder;
    

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Log.d("TESTVERSION: ", "5");
        
        // ListView initialisieren
        final ListView lv = (ListView) findViewById(R.id.listview);
        this.listAdapter = new RRListAdapter(this);
        lv.setAdapter(this.listAdapter);
        
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
            {
                // Datei wiedergeben
                File file = listAdapter.getItem(position);
                playAudioFile(file.getAbsolutePath());
            }
        });
        
        // Schaltfläche Aufnehmen/Beenden initialisieren
        b = (Button) findViewById(R.id.button);
        b.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v)
            {
                if (mode == MODE.WAITING) 
                {
                    currentFile = recordToFile();
                } 
                else if (mode == MODE.RECORDING)
                {
                    // die Aufnahme stoppen
                    recorder.stop();
                    releaseRecorder();
                    listAdapter.add(currentFile);
                    currentFile = null;
                    mode = MODE.WAITING;
                    updateButtonText();
                } 
                else if (mode == MODE.PLAYING) 
                {
                    player.stop();
                    releasePlayer();
                    mode = MODE.WAITING;
                    updateButtonText();
                }
            }
        });
        
        this.currentFile = null;
        this.mode = MODE.WAITING;
        this.player = null;
        this.recorder = null;
        updateButtonText();
    }

    
    @Override
    protected void onPause()
    {
        super.onPause();
        releasePlayer();
        releaseRecorder();
    }

    
    private void updateButtonText()
    {
        String txt;
        
        if(this.mode != MODE.WAITING)
            txt = this.getString(R.string.finish);
        else
            txt = this.getString(R.string.record);
        
        this.b.setText(txt);
    }

    
    private File recordToFile()
    {
        this.recorder = new MediaRecorder();
        this.recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        this.recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
        this.recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        
[COLOR=Teal] [COLOR=DarkRed]  [COLOR=Yellow]    [COLOR=Blue] //File file = new File(Environment.getExternalStorageDirectory(), "audioaufzeichnung.3gp");[/COLOR][/COLOR][/COLOR][/COLOR]
      [COLOR=DarkOrange]  File file = new File(this.getFilesDir(), "audioaufzeichnung.3gp");[/COLOR]
        
        try
        {
            file.createNewFile();
            this.recorder.setOutputFile(file.getAbsolutePath());
            this.recorder.prepare();
            this.recorder.start();
            this.mode = MODE.RECORDING;
            updateButtonText();
            Log.d("DATEI GESPEICHERT IN:", file.getAbsolutePath());
            return file;
        } 
        catch (IOException e) 
        {
            Log.e(TAG, "could not start recording", e);
        }
        
        return null;
    }

    
    private void releaseRecorder()
    {
        if (recorder != null) 
        {
            // Recorder-Ressourcen freigeben
            recorder.release();
            recorder = null;
        }
    }

    
    private void playAudioFile(String filename)
    {
        this.player = new MediaPlayer();
        this.player.setOnCompletionListener(new OnCompletionListener() {
            
            public void onCompletion(MediaPlayer player)
            {
                releasePlayer();
                mode = MODE.WAITING;
                updateButtonText();
            }
        });
        
        try 
        {
            Log.d("DATEI GEHOLT AUS:", filename);
            this.player.setDataSource(filename);
            this.player.prepare();
            this.player.start();
            this.mode = MODE.PLAYING;
            updateButtonText();
        } 
        catch (Throwable thr) 
        {
            Log.e(TAG, "could not play audio", thr);
        }
    }

    
    private void releasePlayer() 
    {
        if (player != null) {
            // Player-Ressourcen freigeben
            player.release();
            player = null;
        }
    }
}
RRListAdapter.java
Code:
package com.thomaskuenneth.rr;

import java.io.File;
import java.io.FilenameFilter;

import android.content.Context;
import android.os.Environment;
import android.util.Log;
import android.widget.ArrayAdapter;

public class RRListAdapter extends ArrayAdapter<File>
{
    private Context context;
    
    public RRListAdapter(Context context) 
    {
        super(context, android.R.layout.simple_list_item_1);
        
        this.context = context;
        findAndAddFiles();
    }

    
    private void findAndAddFiles() 
    {        
        [COLOR=Blue]//File dir = Environment.getExternalStorageDirectory(); [/COLOR]       //  /mnt/sdcard
    [COLOR=DarkOrange]    File dir = this.context.getFilesDir();  [/COLOR]                       //  /data/data/com.thomaskuenneth.rr/files    
        
        File[] files = dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String filename) 
            {
                if (!filename.toLowerCase().endsWith(".3gp")) 
                {
                    return false;
                }
                
                File f = new File(dir, filename);
                return f.canRead() && !f.isDirectory();
            }
        });
        
        if (files != null)
        {
            for (File f : files)
            {
                this.add(f);
            }
        }
    }
}
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.thomaskuenneth.rr"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="15" />
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".RR"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>
Code:
06-01 11:14:22.583: D/dalvikvm(23451): GC_FOR_ALLOC freed 47K, 9% free 9257K/10143K, paused 24ms
06-01 11:14:22.583: I/dalvikvm-heap(23451): Grow heap (frag case) to 10.690MB for 1639696-byte allocation
06-01 11:14:22.623: D/dalvikvm(23451): GC_FOR_ALLOC freed 3K, 9% free 10855K/11811K, paused 19ms
06-01 11:14:22.683: D/TESTVERSION:(23451): 5
06-01 11:14:22.754: D/TextLayoutCache(23451): Using debug level: 0 - Debug Enabled: 0
06-01 11:14:22.804: D/libEGL(23451): loaded /system/lib/egl/libGLES_android.so
06-01 11:14:22.824: D/libEGL(23451): loaded /system/lib/egl/libEGL_mali.so
06-01 11:14:22.834: D/libEGL(23451): loaded /system/lib/egl/libGLESv1_CM_mali.so
06-01 11:14:22.834: D/libEGL(23451): loaded /system/lib/egl/libGLESv2_mali.so
06-01 11:14:22.864: D/OpenGLRenderer(23451): Enabling debug mode 0
06-01 11:14:35.936: D/DATEI GESPEICHERT IN:(23451): /data/data/com.thomaskuenneth.rr/files/audioaufzeichnung.3gp
06-01 11:14:42.223: W/MediaRecorder(23451): mediarecorder went away with unhandled events
06-01 11:15:12.072: D/DATEI GEHOLT AUS:(23451): /data/data/com.thomaskuenneth.rr/files/audioaufzeichnung.3gp
06-01 11:15:12.092: E/MediaPlayer(23451): error (1, -2147483648)
06-01 11:15:12.112: E/RR(23451): could not play audio
06-01 11:15:12.112: E/RR(23451): java.io.IOException: Prepare failed.: status=0x1
06-01 11:15:12.112: E/RR(23451):     at android.media.MediaPlayer.prepare(Native Method)
06-01 11:15:12.112: E/RR(23451):     at com.thomaskuenneth.rr.RR.playAudioFile(RR.java:184)
06-01 11:15:12.112: E/RR(23451):     at com.thomaskuenneth.rr.RR.access$1(RR.java:167)
06-01 11:15:12.112: E/RR(23451):     at com.thomaskuenneth.rr.RR$1.onItemClick(RR.java:58)
06-01 11:15:12.112: E/RR(23451):     at android.widget.AdapterView.performItemClick(AdapterView.java:292)
06-01 11:15:12.112: E/RR(23451):     at android.widget.AbsListView.performItemClick(AbsListView.java:1068)
06-01 11:15:12.112: E/RR(23451):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2525)
06-01 11:15:12.112: E/RR(23451):     at android.widget.AbsListView$1.run(AbsListView.java:3186)
06-01 11:15:12.112: E/RR(23451):     at android.os.Handler.handleCallback(Handler.java:605)
06-01 11:15:12.112: E/RR(23451):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-01 11:15:12.112: E/RR(23451):     at android.os.Looper.loop(Looper.java:137)
06-01 11:15:12.112: E/RR(23451):     at android.app.ActivityThread.main(ActivityThread.java:4448)
06-01 11:15:12.112: E/RR(23451):     at java.lang.reflect.Method.invokeNative(Native Method)
06-01 11:15:12.112: E/RR(23451):     at java.lang.reflect.Method.invoke(Method.java:511)
06-01 11:15:12.112: E/RR(23451):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
06-01 11:15:12.112: E/RR(23451):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
06-01 11:15:12.112: E/RR(23451):     at dalvik.system.NativeStart.main(Native Method)
 
Hallo,
06-01 11:15:12.112: E/RR(23451): could not play audio
Hier ist der Fehler. Deine Audio-Datei kann nicht abgespielt werden. Hier ist es die häufigste Ursache ein falsches Audio Format.
.../audioaufzeichnung.3gp
Das Format 3gp ist ein Videoformat(Wikipedia-3gp), daher vermute ich mal, dass es deswegen nicht funkioniert. Probier mal eine .mp3 Datei!
Gruß

EDIT: Grad nochmal nachgeschaut, man kann 3gp auch für Audio alleine benutzen, hatte in Erinnerung, es ginge nur für Audio. Daran sollte es doch nicht liegen.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: BlupBlup
Eigentlich ganz einfach:
Fehlende Rechte!

Wenn du eine Datei mit dem Media Player abspielst läuft der Mediaplayer nicht mit den gleichen Rechten wie deine App.
Der MediaPlayer wird quasi als eigene App gestartet und hat somit keine Lese Rechte in deinem App Verzeichnis.

Nähere Informationen findest du hier:
http://www.weston-fl.com/blog/?p=2988
 
  • Danke
Reaktionen: BlupBlup
@amfa: Das hat funktioniert. Danke.
 

Ähnliche Themen

AnnaBauer21
Antworten
0
Aufrufe
252
AnnaBauer21
AnnaBauer21
D
Antworten
8
Aufrufe
535
jogimuc
J
S
Antworten
7
Aufrufe
708
Silvasurf
S
AnnaBauer21
Antworten
6
Aufrufe
598
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten