Android - 如何从原始文件中获取 Uri?
Posted
技术标签:
【中文标题】Android - 如何从原始文件中获取 Uri?【英文标题】:Android - How to get Uri from raw file? 【发布时间】: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)
【问题讨论】:
【参考方案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()
【讨论】:
以上是关于Android - 如何从原始文件中获取 Uri?的主要内容,如果未能解决你的问题,请参考以下文章
Android:给定原始图像的Uri,获取SD卡上图像的缩略图
如何从 Uri xamarin android 获取实际路径