1. ホーム
  2. Android

オーディオとビデオを再生するための資産と生でAndroidの練習

2022-02-16 10:53:18
<パス

Androidの開発では、QRコードのバーコードをスキャンすると"beep"でユーザーを促したり、マイクロブログを更新すると音が鳴ったり、APPによっては開いた後にアニメーション(動画)を再生するなど、音声や動画ファイルの再生が必要になることがよくあります。これらのファイルは、呼び出すプロジェクトのassetsまたは/res/rawディレクトリに保存されます。
例えば、assetsにある音声は以下のようなコードで再生されます。

//In the Activity
try {
AssetManager assetManager = this.getAssets();
AssetFileDescriptor afd = assetManager.openFd("bg.wav");
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
player.setLooping(true);//Loop
player.prepare();
player.start();
} catch (Exception e) {
e.printStackTrace();
}

このメソッドに注目してください。 player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()));
このメソッドの3つのパラメーターはすべて設定する必要があります。1つのパラメーターだけを設定すると例外が報告され、実行されません。

アセットディレクトリのファイル(フォルダ)をイテレートする。

AssetManager assetManager = this.getAssets();
String [] files = assetManager.list("")//Iterate through the assets root directory

assetsディレクトリからURIを構築しても、動画の再生や音声の再生には使用できません。rawディレクトリにあるファイルに対するURIを構築すると、オーディオを再生し、ビデオを再生します。
"beep"音声を再生するには。

//Uri notification = Uri.parse("file:///android_asset/beep.ogg"); //this doesn't work
Uri notification = Uri.parse("android.resource://"+getActivity().getPackageName()+"/"+R.raw.beep); 
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);  
r.play();

動画を再生します。

VideoView vv = (VideoView)this.findViewById(R.id.videoView)
String uri = "android.resource://" + getPackageName() + "/" + R.raw.my_video_file;
vv.setVideoURI(Uri.parse(uri));
vv.start();

同様に、ここで構築されたURI file:///android_asset/xxx.xxx は再生されません。

それでもassetsは、最近のHybrid APP開発の基本であるWebページの読み込みにかなり便利なんです。

webView.loadUrl(file:///android_asset/test.html);

また、一部の音声や動画、あるいは画像やPDFの再生は、MIMEタイプを判別して が付属しています。 を使って開くか、開くことができるアプリが複数ある場合は、開くアプリを選択するためのダイアログボックスをポップアップします:。

private void openFile(File file){
try {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Set the Action property of the intent
intent.setAction(Intent.ACTION_VIEW);
//get the MIME type of the file file
String type = getMIMEType(file);
//set the data and type properties of the intent.
intent.setDataAndType(/*uri*/Uri.fromFile(file), type);
//jump
startActivity(intent); //It's better to try here, it may report an error. //For example, if your MIME type is open mailbox, but you don't have an email client installed inside your phone, it will report an error.
} catch (Exception e) {
t("Failed to open file");
}

// Get the MIME type, you can define your own table of MIME, and then determine the file type by the file suffix name:.

/**
* Get the corresponding MIME type based on the file suffix name.
* @param file
*/
private String getMIMEType(File file) {

String type="*/*";
String fName = file.getName();
//Get the separator before the suffix name ". " position in fName.
int dotIndex = fName.lastIndexOf(". ");
if(dotIndex < 0){
return type;
}
/* Get the file's suffix name */
String end=fName.substring(dotIndex,fName.length()).toLowerCase();
if(end=="")return type;
//Find the corresponding MIME type in the matching table of MIME and file types.
for(int i=0;i<MIME_MapTable.length;i++){
if(end.equals(MIME_MapTable[i][0]))
type = MIME_MapTable[i][1];
}
return type;
}

private final String[][] MIME_MapTable = {
//{suffix name, MIME type}
{
".3gp", "video/3gpp"}
{
".apk", "application/vnd.android.package-archive"},
{
".asf", "video/x-ms-asf"},
{
".avi", "video/x-msvideo"},
{
".bin", "application/octet-stream"},
{
".bmp", "image/bmp"},
{
".c", "text/plain"},
{
".class", "application/octet-stream"},
{
".conf", "text/plain"},
{
".cpp", "text/plain"},
{
".doc", "application/msword"},
{
".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
{
".xls", "application/vnd.ms-excel"},
{
".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
{
".exe", "application/octet-stream"},
{

".gif", "image/gif"},
{
".gtar", "application/x-gtar"},
{
".gz", "application/x-gzip"},
{
".h", "text/plain"},
{
".htm", "text/html"},
{
".html", "text/html"},
{
".jar", "application/java-archive"},
{
".java", "text/plain"},
{
".jpeg", "image/jpeg"},
{
".jpg", "image/jpeg"},
{
".js", "application/x-javascript"},
{
".log", "text/plain"},
{
".m3u", "audio/x-mpegurl"},
{
".m4a", "audio/mp4a-latm"},
{
".m4b", "audio/mp4a-latm"},
{
".m4p", "audio/mp4a-latm"},
{
".m4u", "video/vnd.mpegurl"},
{
".m4v", "video/x-m4v"},
{
".mov", "video/quicktime"},
{
".mp2", "audio/x-mpeg"},
{
".mp3", "audio/x-mpeg"},
{
".mp4", "video/mp4"},
{
".mpc", "application/vnd.mpohun.certificate"},
{
".mpe", "video/mpeg"},
{
".mpeg", "video/mpeg"},
{
".mpg", "video/mpeg"},
{
".mpg4", "video/mp4"},
{
".mpga", "audio/mpeg"},
{
".msg", "application/vnd.ms-outlook"},
{
".ogg", "audio/ogg"},
{
".pdf", "application/pdf"},
{
".png", "image/png"},
{
".pps", "application/vnd.ms-powerpoint"},
{
".ppt", "application/vnd.ms-powerpoint"},
{
".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
{
".prop", "text/plain"},
{
".rc", "text/plain"},
{
".rmvb", "audio/x-pn-realaudio"},
{
".rtf", "application/rtf"},
{
".sh", "text/plain"},
{
".tar", "application/x-tar"},
{
".tgz", "application/x-compressed"},
{
".txt", "text/plain"},
{
".wav", "audio/x-wav"},
{
".wma", "audio/x-ms-wma"},
{
".wmv", "audio/x-ms-wmv"},
{
".wps", "application/vnd.ms-works"},
{
".xml", "text/plain"},
{
".z", "application/x-compress"},
{
".zip", "application/x-zip-compressed"},
{
"", "*/*"}
};

ファイルを開く操作を自分で処理する代わりに、システムにファイルの種類を判断させ、実行する適切なアプリを選択させます。ウィンドウズでファイルを開くのと同じです。