2013-03-27 132 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);