【问题标题】:Load a file from external storage to Inputstream将文件从外部存储加载到 Inputstream
【发布时间】:2013-03-17 05:37:20
【问题描述】:

我的外部目录中有一个视频文件。我怎样才能将它加载到输入流变量。 目前我正在读取 res/raw 文件夹中的文件,但我想从 sdcard 中读取它。我也不知道文件的名称,但它的路径将通过意图接收。 检查以下代码

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

【问题讨论】:

  • 所有三个答案都无法理解 URI 是什么,并且它们并不总是文件路径。如果您有文件路径,您会自己弄清楚,但发布的答案并不能回答实际问题。

标签: android inputstream android-file


【解决方案1】:

试试

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

然后你可以从流中读取。

【讨论】:

  • 感谢它的工作。但我不能在这里有太多的噪音。知道为什么会这样吗?
  • 注意:此答案仅适用于 OP 的问题(OP 的 uri 是文件路径)。在更一般的情况下, Uri.toString() 不一定返回文件路径(uri 可以是内容路径或 url 等)。此方法仅适用于作为文件路径的 Uri。检查这个问题的答案:stackoverflow.com/questions/5657411/…
  • 那么问题的标题是“从外部存储加载文件”。我认为在这种情况下假设传入的 uri 是一个文件是安全的。
【解决方案2】:
String fileName = "OfflineMap/maps.xml";
String path = Environment.getExternalStorageDirectory()+"/"+fileName;
File file = new File(path);
FileInputStream fileInputStream = new FileInputStream(file);

【讨论】:

    【解决方案3】:

    这是一个工作代码,你可以将 InputStream 与一个存储文件:

           File sdcard = Environment.getExternalStorageDirectory();
           File file = new File(sdcard,"Demo.xml");
           InputStream fileInputStream = new FileInputStream(file);
    

    【讨论】:

      【解决方案4】:
      soundFile = openFileInput(uri);
      

      【讨论】:

        猜你喜欢
        • 2012-12-06
        • 2014-10-19
        • 2023-03-05
        • 2022-01-21
        • 2011-12-26
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        • 2021-10-28
        相关资源
        最近更新 更多