2013-05-28 23 views
8

Sto cercando di ottenere il Uri da un file raw che ho incluso nel progetto nella cartella raw. Ma sto ottenendo un FileNotFoundException, non importa quale.Android - Come ottenere Uri dal file raw?

Il file è un file .wav, anche provato con un .mp4, inoltre non funziona. L'esecuzione di entrambi i file con MediaPlayer funziona.

I Uri rendimenti: mark.dijkema.android.eindopdracht/2130968576

mio codice:

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(); 
     } 
    } 
} 

l'errore:

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

risposta

19

Prova questo approccio, utilizzare getResources().openRawResource(ResourceID) come inputStream. Da qualche parte lungo questo:

//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) restituisce un InputStream

EDIT: Elimina questa codice se si utilizza l'approccio di cui sopra

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

Spero che questo aiuti, buona fortuna! ^^

+0

Sì, funziona ora. Hai bisogno di sistemare l'audio, molto rumore e cose del genere. – DijkeMark

+0

Felice di sentirlo, buona fortuna a schiarire il rumore e gli animali ^^ – reidzeibel

2

È possibile aprire l'InputStream alla risorsa grezza come questa:

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