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
RRListAdapter.java
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;
}
}
}
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)