我是Android新手,一直试图让HTML5
为了验证是否可以找到并播放这些文件,作为测试的一部分,我创建了一个代码变体,其中声音将通过标记触发,并由WebViewClient处理,使用以下建议:
assets
> audio
> a-00099954.mp3
> a-00099954.ogg
> image
> script
> style
> video
audioTest.html
package com.test.audiotag;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
public class MainActivity extends Activity
{
private WebView localBrowser;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
localBrowser = (WebView)findViewById(R.id.localbrowser);
localBrowser.getSettings().setJavaScriptEnabled(true);
localBrowser.loadUrl("file:///android_asset/audioTest.html");
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android ="http://schemas.android.com/apk/res/android"
package ="com.test.audiotag"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="14" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name =".MainActivity"
android:label ="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=300, height=400">
<style type="text/css">
#centre_all
{
-webkit-box-flex : 0;
position : relative;
background-color : #D0D000;
border : 2px dotted red;
-webkit-box-shadow: 0 0 5px red;
}
</style>
</head>
<body>
<div id="centre_all" style="width:300px;height:400px;">
<audio controls="controls" autoplay="autoplay">
<source src="audio/a-00099954.mp3" type="audio/mpeg" />
<source src="audio/a-00099954.ogg" type="audio/ogg"/>
 
</audio>
</div>
</body>
</html>
我尝试了3种方法来解决这个问题,每一种方法都是其他方法的变体,每一种方法都涉及将原始音频文件从内部“资产”目录(显然默认的媒体播放器无法访问)复制到一个可以访问的目录。链接中描述了各种目标目录:
http://developer.android.com/guide/topics/data/data-storage.html
其中使用了这三个:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
localBrowser = (WebView)findViewById(R.id.localbrowser);
localBrowser.getSettings().setJavaScriptEnabled(true);
localBrowser.setWebViewClient(new WebViewClient());
localBrowser.setWebChromeClient(new WebChromeClient());
...
Context context = localBrowser.getContext();
File filesDir = context.getFilesDir();
Log.d("FILE PATH", filesDir.getAbsolutePath());
if (filesDir.exists())
{
filesDir.setReadable(true, false);
try
{
String[] audioFiles = context.getAssets().list("audio");
if (audioFiles != null)
{
byte[] buffer;
int length;
InputStream inStream;
FileOutputStream outStream;
for (int i=0; i<audioFiles.length; i++)
{
inStream = context.getAssets().open(
"audio/" + audioFiles[i] );
outStream = context.openFileOutput(audioFiles[i],
Context.MODE_WORLD_READABLE);
buffer = new byte[8192];
while ((length=inStream.read(buffer)) > 0)
{
outStream.write(buffer, 0, length);
}
// Close the streams
inStream.close();
outStream.flush();
outStream.close();
}
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Feedback
String[] fileList = context().fileList();
Log.d("FILE LIST", "--------------");
for (String fileName : fileList)
{
Log.d("- FILE", fileName);
}
...
}
<div id="centre_all" style="width:300px;height:400px;">
<audio controls="controls" autoplay="autoplay">
<source src="/data/data/com.test.audiotag/files/a-00099954.mp3" type="audio/mpeg" />
<source src="audio/a-00099954.mp3" type="audio/mpeg" />
 
</audio>
</div>
使用此解决方案,尝试使用“ondestroy()”方法清除复制到“/mnt/sdcard/temp”目录中的临时文件,但实际上,该方法似乎从未执行(尝试调用“onstop()”和“onpause()”,但它们过早地删除了文件)。这里给出的对“ondestroy()”的讨论证实了它的代码可能无法执行:
http://developer.android.com/reference/android/app/activity.html#ondestroy()
舱单条目
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
private String[] audioList;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
localBrowser = (WebView)findViewById(R.id.localbrowser);
localBrowser.getSettings().setJavaScriptEnabled(true);
localBrowser.setWebViewClient(new WebViewClient());
localBrowser.setWebChromeClient(new WebChromeClient());
...
Context context = localBrowser.getContext();
File dirRoot = new File(Environment.getExternalStorageDirectory().toString());
Log.d("ROOT DIR PATH", dirRoot.getAbsolutePath());
if (dirRoot.exists())
{
File dirTemp = new File(dirRoot.getAbsolutePath() + "/temp");
if (!dirTemp.exists())
{
if (!dirTemp.mkdir())
{
Log.e("AUDIO DIR PATH", "FAILED TO CREATE " +
dirTemp.getAbsolutePath());
}
}
else
{
Log.d("AUDIO DIR PATH", dirTemp.getAbsolutePath());
}
if (dirTemp.exists())
{
dirTemp.setReadable(true, false);
dirTemp.setWritable(true);
try
{
String[] audioFiles = context.getAssets().list("audio");
if (audioFiles != null)
{
byte[] buffer;
int length;
InputStream inStream;
FileOutputStream outStream;
audioList = new String[audioFiles.length];
for (int i=0; i<audioFiles.length; i++)
{
inStream = context.getAssets().open(
"audio/" + audioFiles[i] );
audioList[i] = dirTemp.getAbsolutePath() + "/" +
audioFiles[i];
outStream = new FileOutputStream(audioList[i]);
buffer = new byte[8192];
while ( (length=inStream.read(buffer)) > 0)
{
outStream.write(buffer, 0, length);
}
// Close the streams
inStream.close();
outStream.flush();
outStream.close();
//audioFile = new File(audioList[i]);
//audioFile.deleteOnExit();
}
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Feedback
String[] fileList = dirTemp.list();
Log.d("FILE LIST", "--------------");
for (String fileName : fileList)
{
Log.d("- FILE", fileName);
}
}
...
} // onCreate()
@Override
public void onDestroy()
{
for (String audioFile : audioList)
{
File hFile = new File(audioFile);
if (hFile.delete())
{
Log.d("DELETE FILE", audioFile);
}
else
{
Log.d("DELETE FILE FAILED", audioFile);
}
}
super.onDestroy();
} // onDestroy()
<div id="centre_all" style="width:300px;height:400px;">
<audio controls="controls" autoplay="autoplay">
<source src="/mnt/sdcard/temp/a-00099954.mp3" type="audio/mpeg" />
<source src="audio/a-00099954.mp3" type="audio/mpeg" />
 
</audio>
</div>
我认为更好的解决方案是使用Javascript函数来启动音频,然后调用Android Java方法来启动自己的MediaPlayer(我可能最终会试验一下)。
Android 4.4发布后不久,我的代码从2.2开始就一直正常工作,但突然出了问题。 我的代码将在音乐数据库中查询给定的音乐文件。在查询中返回路径,然后将该路径传递到MediaPlayer。 代码: 我最终在我的 LogCat 中得到了无用的错误(1, -2147483648) 消息。 我也尝试过更换 具有 但这会在新的 FileInputStream(...) 上生成一个 FileNotFou
我一直在用新的gradle插件1.4.0-beta3测试Android Studio。 我一直在尝试导入自己在Inkscape中制作的向量资产。然而,我不断收到导入错误。错误消息在svg中包含许多arn不支持的标记。 有人知道原因吗?是向量资产工具中的错误吗?或者可能是Inkscape创建的svgs的问题?或者不支持更复杂的svgs? 谢谢
我正在用c#进行一个项目,我必须集成斯坦福pos tagger API,虽然我已经完成了,但是当我编译代码时,我得到了一个错误 stanford-postagger-3.6.0.dll中发生了类型edu.stanford.nlp.io.RuntimeIOExcure的异常,但用户代码中没有处理 其他信息:加载标记器模型时出错(可能缺少模型文件) 在我的代码中,此错误所指向的行是: 注意:我是如何安
我想使用flatter和dart在webview中呈现存储在手机内存中的本地HTML文件。
这是我在LeetCode中为这个问题编写的代码片段。 } 为什么会这样?请解释一下。
我在几乎所有的系统上都会看到“令牌语法错误,请删除这些令牌”。出来系统第一个实例后的println文本。出来普林顿。我不知道这意味着什么,也不知道如何解决?我是一个非常新的开始,所以这个代码中可能有多个错误。我还得到了“令牌上的语法错误”“Double is”“无效的AssignmentOperator”“和”“squared is”“,以及无效的AssignmentOperator”错误。这是一