2013-03-27 36 views
23

我在我的外部目錄中有一個視頻文件。我怎樣才能將它加載到輸入流變量。 目前我正在閱讀res/raw文件夾中的文件,但我想從sdcard中讀取它。我也不知道文件的名稱,但它的路徑將通過意圖收到。 檢查下面的代碼從外部存儲器加載文件到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

所有三個答案不明白一個URI是什麼,他們並不總是一個文件路徑。如果你有自己的文件路徑,但是發佈的答案並不能回答真正的問題。 – BooleanCheese 2016-05-13 17:46:57

回答

54

嘗試

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

然後你可以從流中讀取。

+0

非常感謝它的工作。但我不能在這裏聽到太多的噪音。任何想法爲什麼是這樣的? – 2013-03-27 07:48:08

+6

注意:這個答案只適用於OP的問題(OP有一個uri是文件路徑)。在更一般的情況下,Uri.toString()不一定會返回文件路徑(uri可能是內容路徑或url等)。此方法僅適用於文件路徑的Uri。檢查這個問題的答案:http://stackoverflow.com/questions/5657411/android-getting-a-file-uri-from-a-content-uri – 2014-10-07 00:34:30

+1

那麼問題的題目是「從外部存儲加載文件」。我認爲假設傳入的uri文件在這種情況下是安全的。 – 2014-10-14 08:44:43

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