在我的应用程序中,用户将选择应用程序随后处理的音频文件.问题是,为了让应用程序按照我想要的方式处理音频文件,我需要URI为文件格式.当我使用Android的原生音乐播放器在应用程序中浏览音频文件时,URI是一个内容URI,如下所示:
content://media/external/audio/media/710
Run Code Online (Sandbox Code Playgroud)
但是,使用流行的文件管理器应用程序Astro,我得到以下内容:
file:///sdcard/media/audio/ringtones/GetupGetOut.mp3
Run Code Online (Sandbox Code Playgroud)
后者对我来说更容易使用,但当然我希望应用程序具有用户选择的音频文件的功能,而不管他们用来浏览他们的集合的程序.所以我的问题是,有没有办法将content://样式URI转换为file://URI?否则,你会建议我解决这个问题?以下是调用选择器的代码,供参考:
Intent ringIntent = new Intent();
ringIntent.setType("audio/mp3");
ringIntent.setAction(Intent.ACTION_GET_CONTENT);
ringIntent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(ringIntent, "Select Ringtone"), SELECT_RINGTONE);
Run Code Online (Sandbox Code Playgroud)
我使用内容URI执行以下操作:
m_ringerPath = m_ringtoneUri.getPath();
File file = new File(m_ringerPath);
Run Code Online (Sandbox Code Playgroud)
然后用所述文件做一些FileInputStream.
根据java api,InputStream.read()描述为:
如果由于到达流末尾而没有可用字节,则返回值-1.此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常.
我有一个while(true)循环执行读取,当通过流发送任何内容时,我总是得到-1.这是预期的.
我的问题是什么时候会读取()阻止?因为如果它没有获得任何数据,则返回-1.我希望阻塞读取等到收到数据.如果你已经到达输入流的末尾,不应该读取()只是等待数据而不是返回-1?
或者read()只阻止是否有另一个线程访问流并且你的read()无法访问流?
这引出了我的下一个问题.我曾经有过事件监听器(由我的库提供),当数据可用时会通知我.当我收到通知时,我会调用while((aByte = read()) > -1)存储字节.当我在非常接近的时间内收到两个事件并且我的所有数据都没有被显示时,我感到很困惑.似乎只显示第二个事件数据的尾端,其余部分丢失了.
我最终改变了我的代码,以便当我得到一个事件时,我会调用if(inputStream.available() > 0) while((aByte = read()) > -1)存储字节.现在它正常工作,我的所有数据都显示出来了.
有人可以解释这种行为吗?该InputStream.available()是说要回,你可以阻止下一个调用方之前读取的字节数(流?).即使我不使用.available(),我希望第一个事件的读取只是阻止第二个事件的读取,但不会擦除或消耗过多的流数据.为什么这样做会导致我的所有数据都不显示?
我有一个使用创建的FileInputStream Context.openFileInput().我现在想将文件转换为字节数组.
不幸的是,我无法确定所需的字节数组的大小FileInputStream.read(byte[]).该available()方法不起作用,我无法使用特定路径名创建文件以检查其长度,可能是因为非root用户无法访问该路径.
我读到了ByteArrayOutputStream,似乎动态调整字节数组大小以适应,但我无法从如何读取FileInputStream到写入ByteArrayOutputStream.
我们可以通过Facebook SDK将视频从Android设备的SD卡上传到Facebook帐户吗?
如果是这样,有什么简单的例子?
我想将手机通讯录导出到外部存储区域.我没有使用这种方法.有人指导我这样做吗?
我知道网站上有很多关于以下内容的问题IOExeption:服务不可用.....我已经检查了我能找到的关于这个主题的所有答案...我正在运行它async task似乎工作得很好但仍然得到相同的例外.
我已经使用isPresent()过以前的尝试,虽然它不在以下代码中,我使用相同的手机.我有互联网许可.我试图改变目标,google api看看是不是问题,但没有区别.
这是第四年项目的重要组成部分,因此任何帮助都是严肃的.在最近之前,ps从未使用过java或android,所以请原谅任何看起来编码的菜鸟.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
view1 = (TextView) findViewById(R.id.textView1);
view2 = (TextView)findViewById(R.id.textView2);
view3 = (TextView)findViewById(R.id.textView4);
b1 = (Button) findViewById(R.id.button1);
locationManager =
(LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
//provider =
// locationManager.getProvider(LocationManager.GPS_PROVIDER);
final LocationListener listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
view2.setText(Double.toString(location.getLatitude()));
view3.setText(Double.toString(location.getLongitude()));
Double lat = Double.valueOf(location.getLatitude());
Double longTemp = Double.valueOf(location.getLatitude());
new geo().execute(lat,longTemp);
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub …Run Code Online (Sandbox Code Playgroud)