【问题标题】:Android - How to get Uri from raw file?Android - 如何从原始文件中获取 Uri?
【发布时间】:2013-05-23 09:19:07
【问题描述】:

我正在尝试从 raw 文件夹中包含在项目中的原始文件中获取 Uri。 但无论如何我都会收到FileNotFoundException

文件是.wav文件,也用.mp4试了一下,还是不行。 使用MediaPlayer 播放这两个文件确实有效。

Uri 返回:mark.dijkema.android.eindopdracht/2130968576

我的代码:

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

错误:

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

【问题讨论】:

    标签: java android uri filenotfoundexception


    【解决方案1】:

    试试这个方法,使用getResources().openRawResource(ResourceID) 作为你的输入流。 某处:

    //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) 返回一个 InputStream

    编辑:如果您使用上述方法,请删除这些代码

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

    希望这会有所帮助,祝你好运! ^^

    【讨论】:

    • 是的,它现在可以工作了。不过需要修复音频,里面有很多噪音等等。
    【解决方案2】:

    试试这个:

    uri = Uri.parse(
                    ContentResolver.SCHEME_ANDROID_RESOURCE
                            + File.pathSeparator + File.separator + File.separator
                            + context.getPackageName()
                            + File.separator
                            + R.raw.myrawname
            );
    

    【讨论】:

      【解决方案3】:

      以下是一些可能对某人有所帮助的方法:

          public Uri getRawUri(String filename) {
              return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/raw/" + filename);
          }
          public Uri getDrawableUri(String filename) {
              return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/drawable/" + filename);
          }
          public Uri getMipmapUri(String filename) {
              return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/mipmap/" + filename);
          }
      

      只需像这样调用方法:

      Uri rawUri = getRawUri("myFile.filetype");
      

      【讨论】:

        【解决方案4】:

        您可以像这样将 InputStream 打开到原始资源:

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

        【讨论】:

        • 那是一个 URI?
        【解决方案5】:

        不要在代码中硬编码东西!使用这个:

        val uri = Uri.Builder()
            .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
            .authority(packageName)
            .appendPath("${R.raw.your_music_file_or_whatever}")
            .build()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-25
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 2015-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多