2013-05-28 5 views
8

Ich versuche, die Uri aus einer Raw-Datei zu bekommen, die ich in das Projekt im raw Ordner aufgenommen habe. Aber ich bekomme eine FileNotFoundException, egal was.Android - Wie Uri aus Raw-Datei zu bekommen?

Die Datei ist eine .wav Datei, auch versuchte es mit einer .mp4, funktioniert auch nicht. Wiedergabe beider Dateien mit MediaPlayer funktioniert.

Die Uri kehrt: mark.dijkema.android.eindopdracht/2130968576

Mein Code:

package mark.dijkema.android.eindopdracht; 

import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

import android.app.Activity; 
import android.media.AudioFormat; 
import android.media.AudioManager; 
import android.media.AudioTrack; 
import android.net.Uri; 
import android.os.Bundle; 

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

     PlayWaveFile(); 
    } 

    private void PlayWaveFile() 
    { 
     // define the buffer size for audio track 
     int minBufferSize = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); 
     int bufferSize = 512; 
     AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 8000, AudioFormat.CHANNEL_OUT_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); 

     Uri url = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.usa_for_africa_we_are_the_world); 
     File file = new File(url.toString()); 

     int count = 0; 
     byte[] data = new byte[bufferSize]; 

     try { 
      FileInputStream fileInputStream = new FileInputStream(file); 
      DataInputStream dataInputStream = new DataInputStream(fileInputStream); 
      audioTrack.play(); 

      while((count = dataInputStream.read(data, 0, bufferSize)) > -1) 
      { 
       audioTrack.write(data, 0, count); 
      } 

      audioTrack.stop(); 
      audioTrack.release(); 
      dataInputStream.close(); 
      fileInputStream.close(); 
     } 
     catch (FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

Der Fehler:

java.io.FileNotFoundException: /mark.dijkema.android.eindopdracht/2130968576: open failed: ENOENT (No such file or directory) 

Antwort

19

diesen Ansatz versuchen, getResources().openRawResource(ResourceID) als input verwenden. Irgendwo entlang dieser:

//FileInputStream fileInputStream = new FileInputStream(file); 
InputStream inputStream = getResources().openRawResource(R.raw.usa_for_africa_we_are_the_world); 
DataInputStream dataInputStream = new DataInputStream(inputStream); 
audioTrack.play(); 

getResources().openRawResource(ResourceID) Gibt einen Input

EDIT: diesen Code entfernen, wenn Sie den obigen Ansatz verwenden

Uri url = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.usa_for_africa_we_are_the_world); 
File file = new File(url.toString()); 

hoffte, das hilft, viel Glück! ^^

+0

Ja, es funktioniert jetzt. Müssen aber das Audio reparieren, viel Lärm drin und so. – DijkeMark

+0

Froh, es zu hören, viel Glück bei der Beseitigung von Lärm und Zeug ^^ – reidzeibel

2

Sie können Ihre Input auf das rohe Ressource wie folgt geöffnet:

InputStream rawInputStream = getResources().openRawResource(R.raw.usa_for_africa_we_are_the_world) 
DataInputStream dataInputStream = new DataInputStream(rawInputStream);