2013-03-27 7 views
23

Ho un file video nella mia directory esterna. come posso caricarlo sulla variabile inputstream. Per ora sto leggendo il file nella cartella res/raw ma voglio leggerlo dalla sdcard. anche io non so circa il nome del file, ma il suo percorso sarà ricevuto attraverso l'intento. verificare il seguente codiceCarica un file da una memoria esterna a Inputstream

public class SonicTest extends Activity 
{ 
VideoView videoView; 
String uri; 
InputStream soundFile; 
File file; 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState);      
    setContentView(R.layout.main); 

} 

public void play(View view) 
{ 
    new Thread(new Runnable() 
    { 
     public void run() 
     { 
      float speed= (float) 1.0; 
      float pitch= (float) 1.5; 
      float rate= (float) 1.0; 
      uri= Environment.getExternalStorageDirectory().toString(); 
      uri=uri+"/video.3gp"; 
      AndroidAudioDevice device = new AndroidAudioDevice(22050, 1); 
      Sonic sonic = new Sonic(22050, 1); 
      byte samples[] = new byte[4096]; 
      byte modifiedSamples[] = new byte[2048]; 
      InputStream soundFile = null; 

    //soundFile = getContentResolver().openInputStream(Uri.parse(uri)); 
    soundFile=getResources().openRawResource(R.raw.video3); 
    Log.i("testing","check if SoundFile is correct "+soundFile); 

      int bytesRead; 

      if(soundFile != null) { 
       sonic.setSpeed(speed); 
       sonic.setPitch(pitch); 
       sonic.setRate(rate); 
       do { 
        try { 
         bytesRead = soundFile.read(samples, 0, samples.length); 
        } catch (IOException e) { 
         e.printStackTrace(); 
         return; 
        } 
        if(bytesRead > 0) { 
         sonic.putBytes(samples, bytesRead); 
        } else { 
         sonic.flush(); 
        } 
        int available = sonic.availableBytes(); 
        if(available > 0) { 
         if(modifiedSamples.length < available) { 
          modifiedSamples = new byte[available*2]; 
         } 
         sonic.receiveBytes(modifiedSamples, available); 
         device.writeSamples(modifiedSamples, available); 
        } 
       } while(bytesRead > 0); 
       device.flush(); 
      } 
     } 
    }).start(); 
}} 
+0

Tutte e tre le risposte non riescono a capire che cosa un URI è e che non sono sempre un percorso di file. Se avessi il percorso del file lo avresti capito da solo, ma le risposte postate non rispondono alla domanda vera e propria. – BooleanCheese

risposta

54

Prova

File file = new File(Uri.toString()); 
FileInputStream fileInputStream = new FileInputStream(file); 

Poi si può leggere dal flusso.

+0

bene grazie al suo funzionamento. ma non posso qui niente c'è troppo rumore. Qualche idea sul perché è così? –

+6

Nota: questa risposta funziona solo per la domanda dell'OP (OP ha un uri che è un percorso file). In termini più generali, Uri.toString() non restituisce necessariamente un percorso file (uri potrebbe invece essere un percorso del contenuto, o url, ecc.). Questo metodo funziona solo per Uri che è un percorso file. controlla la risposta a questa domanda: http://stackoverflow.com/questions/5657411/android-getting-a-file-uri-from-a-content-uri –

+1

Bene la domanda è intitolata "Carica un file da una memoria esterna". Penso che assumere l'uri in arrivo sia un file sicuro in quel caso. –

0
soundFile = openFileInput(uri); 
6
String fileName = "OfflineMap/maps.xml"; 
String path = Environment.getExternalStorageDirectory()+"/"+fileName; 
File file = new File(path); 
FileInputStream fileInputStream = new FileInputStream(file);