内容API指南

内容API指南

概述

内容API提供了发现设备上可用多媒体内容(如图片,视频,音乐等)的功能。 可以使用筛选器来搜索特定的媒体项目 (还可以搜索特定的文件夹)。 API还支持设置特定媒体条数的属性。 从开发者的角度来看,本教程可以帮助理解怎样用API来获得有关存储在内部和外部存储器的媒体内容信息。 本文也展示了怎样来开发一个简单的媒体内容浏览器,该浏览器用来显示所有的媒体条目目录。 过滤器只能用于寻找图像,视频或音频文件。

当应用程序启动时,内容对象会在tizen对象中自动实例化。 tizen.content对象是ContentManager接口的实例,该接口提供了对媒体内容检索功能。

内容表

先决条件

内容API提供了不同级别的访问权限来搜索多媒体内容。 要使用这些API,需在config.xml文中添加需要的权限。
您可以在config.xml文件中用下列权限:

注意:建议您使用Tizen IDE接口来编辑config.xml文件。

如果你想手动执行操作,请将下列 记添加到 config.xml中,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://yourdomain/TizenContentAPI" version="1.0.0" viewmodes="maximized">
    <tizen:application id="UIoRYDQ7wy.TizenContentAPI" package="UIoRYDQ7wy" required_version="2.2"/>
    <content src="index.html"/>
    <icon src="icon.png"/>
    <name>TizenContentAPI</name>
    <tizen:privilege name="http://tizen.org/privilege/content.read"/>
    <tizen:privilege name="http://tizen.org/privilege/content.write"/>
</widget>

注: 由于应用程序将包含的退出按钮,它将需要的退出功能。 为了提供它,请添加application.read功能。

获取ContentManager实例

你需要有一个 ContentManager 实例,以便使用内容相关的 functionalitieses。 方法 tizen.content 检索使用泰全局对象的 ContentManager 接口实例。该方法返回一个对象,提供媒体项目管理功能 (例如更新以及查找媒体项目、 获取和浏览与该设备上的媒体项目的目录。 为了提高效率,它还提供了对媒体项目,如联系人,批处理操作
消息传递 Api。

注意: 您需要用于访问所有内容 API 功能,使用当地的 ContentManager 实例。 该方,tizen.content 返回本地 mediasource 对象

获取所有目录列表

对于使用内容功能,平台默认 ContentManager 对象是必需的。可以调用方法 tizen.content,它返回的 ContentManager 对象。 此对象提供操纵媒体项的操作。 若要获取所有目录的列,请使用方法 tizen.content.getDirectories()。 它需要两个回调函数作为参数,第一个参数是 onMediaFolderArraySuccess 成功,第二个参数 ErrorCallback 函数时调用的回调函数。

 // Function to get list of all directories/folders
function getFoldersList() {
	var mediasource = null;
	mediasource = tizen.content;
	output.set('Searching for all directories...');
	try {
		mediasource.getDirectories(onMediaFolderListSuccess, onError);
	} catch (exc) {
		output.append('getDirectories() exception:' + exc.message);
	}
 }

"Mediasource.getDirectories"调用的成功调函数 onMediaFolderListSuccess。该函数接收的发现作为其参数的所有目录的列表,遍历所有目录并打印的基本信息。

 function onMediaFolderListSuccess(folders) {
   output.append(folders.length  + 'folder(s) found:');
   var table;
   for (var i = 0, len = folders.length; i < len; i++) {
	table = '<table>';
	table += '<tr><td> Folder name: </td><td>' + folders[i].title + '</td></tr>';
	table += '<tr><td> Folder URI: </td><td>' + folders[i].folderURI + '</td></tr>';
	table += '<tr><td> Storage type: </td><td>' + folders[i].storageType + '</td></tr>';
	table += '<tr><td> Modification date: </td><td>' + folders[i].modifiedDate + '</td></tr>';
	table += '</table>';
	output.append(table);
    }
}

调用回调函数"出错",当 mediasource.getDirectories 函数将返回错误消息。此函数可用于实现错误处理特定错误类型的功能。 以下功能只是显示错误消息。

function onError(response) {
    alert( "Error : " + response.name);
}

从内部/外部存储中获取目录列表

可以使用内容的"getDirectories"方法检索的从内部或外部,某些存储位置即目录列表。 首先需要获得使用"tizen.content"方法并调用该方法与 ContentManager 对象作为"source.getDirectories""getDirectories"ContentManager 对象。

// Function to get list of all directories from either internal or external storage
function getStorageSpecificList(){
	var source = null;
	source = tizen.content;
	source.getDirectories(onMediaStorageFilteredSuccess, onError);
}

如果成功,回调函数"onMediaStorageFilteredSuccess"调用并显示从指定的存储类型,即内部或外部的所有目录。

function onMediaStorageFilteredSuccess(folders) {
    var type = document.getElementById('StorageType').value;
    output.set(folders.length + 'folder(s) found:');
    var table;
    for (var i = 0, len = folders.length; i < len; i++) {
    if (folders[i].storageType == type) {
       table = '<table>';
       table += '<tr><td> Folder name: </td><td>' + folders[i].title + '</td></tr>';
       table += '<tr><td> Folder URI: </td><td>' + folders[i].folderURI + '</td></tr>';
       table += '<tr><td> Storage type: </td><td>' + folders[i].storageType + '</td></tr>';
       table += '<tr><td> Modification date: </td><td>' + folders[i].modifiedDate + '</td></tr>';
       table += '</table>';
       output.append(table);
      }
    }
}

获取所有媒体条目列表

可以使用 ContentManager 的"find ()"方法检所有媒体项的列表。 ContentManager 对象首先需要获得使用"tizen.content 并调用该方法与 ContentManager 对象作为"mediasource.find()"的"find ()"。

// Function to get list of all media files
 function getAllMediaList(){
    var mediasource = null;
    mediasource = tizen.content;
    try {
	mediasource.find(onMediaListSuccess, onError);
	} catch (exc) {
  	console.log("findItems exception:" + exc.message);
	}
}

如果成功,调回调函数"onMediaListSuccess"和该函数显示所有项目即所有图像,音频,视频文件。函数接收所有媒体项作为它的参数集合。它遍历所有媒体项和打印的基本信息。

function onMediaListSuccess(items) {
    output.set('Items found...');
    for ( var i in items) {
    output.append('Item title: ' + items[i].title);
    output.append('Item URI: ' + items[i].itemURI);
    output.append('Item type: ' + items[i].type);
   }
}

获取特定条目列表:图像,音频,视频

与筛选器一起使用 ContentManager 的"find ()"的方法,可以检索的特定媒体类型的所有媒体项的列表。 图像、 音频或视频,可以将媒体项的类型。

首先,ContentManager 的对象需要使获得"tizen.content 和调用方法"find ()"
ContentManager 对象作"mediasource.find()"("形象"、"视频"、"音频") 将被筛选的项类型的筛选器参数

// Function to get list of all certain media files
 function getSelectedMediaList() {
    var mediasource = null;
    mediasource = tizen.content;
    var type = document.getElementById('MediaType').value;
    output.set('Searching for items of a type ' + type);
    var filter = new tizen.AttributeFilter ("type", "EXACTLY", type);
    try {
	mediasource.find(onMediaListSuccess, onError, null, filter);
    } catch (exc) {
	console.log("findItems exception:" + exc.message);
	return;
    }
}

此方法使用相同的功回调函数"onMediaListSuccess",正如前面提到的显示所有项目即所有图像,音频,视频文件。
上面的示例使用"AttributeFilter"筛选器来查找特定的媒体类型,使用"项目类型字段。 注意: 在"查找"方法中的第三个参数,目录 ID 设置为 null。

因此,查找操作将搜索所有目录都在设备上的媒体内容。 您可以根据特定的 dierctory 将搜索限制通过目录 id。

检索给定目录中的项目列表

以下函数检索 (成功回调函数数组) 中的所有目录信息的 ContentManager 对象上使用"getDirectories"方法 (在本例中,它是 mSource)。

// Function to get list of all directories
function getMediaFromFolder(){
try {
	mSource = tizen.content;
	output.set('Searching for media from folder...');
	mSource.getDirectories(onMediaFolderSearchSuccess, onError);
    } catch (e) {
	onError(e);
    }
}

回调函 onMediaFolderSearchSuccess() 获取所有媒体的目录。 该函数遍历的目录的所有阵列。 若要标识特定的文件夹中,每个文件夹的 title 属性被比作用户输入目录名称。 如果名称匹配,法 tizen.content.find() 是
用要浏览该指定的文件夹中的所有项目的目录 ID 调用。 为每个从目录项,调 print () 方法来显示的项的名称

// Function for finding certain folder and print its content
function onMediaFolderSearchSuccess(folders) {
    var name = document.getElementById('FolderNameText').value;
    if (!name) {
	output.set('Error: Incorrect folder name');
	return;
     }
    for ( var i in folders) {
	if (folders[i].title == name) {
	output.append('Folder name: ' + folders[i].title + '');
        try {
		mSource.findItems(browseMediaInFolder, onError, folders[i].id);
		} catch(error) {
			alert('error: ' + error.message);
		}
	                return;
		}
	}
}

function print(item) {
	output.append("Title: " + item.title);
}

function browseMediaInFolder(items) {
	output.append('Looking for media in a folder');
	items.forEach(print);
}

获取指定媒体条目的详细信息

类似的方法来查找所需项目的后面可以在这里。 以下函数检索 (成功回调函数数组) 中的所有项目使用"查找"方法在 ContentManager 对象上 (在这种情况下,它是 mSource)。

// Function to get all media files
function getRequiredMediaDetails() {
	try {
		mSource = tizen.content;
		output.append('Searching for item...');
		mSource.find(onMediaFileListSuccess, onError);
	} catch (e) {
		onError(e);
	}
}

成功 ("mSource.find"方法),在阵列中的项目 ("文件"在这里) 调用回调函数"onMediaItemArraySuccess()"。 该函数打印媒体文件的详细信息并创建按钮,稍后更新媒体文件。 将"文件"对象复制新创建的 FilesForUpdate 全局变量。
此变量将用于更新该文件。 创建一个按钮,每个文件,使用 HTML 代码来显示。 更新按钮点"update ()"函数调用,使用 id 作为参数。 参数 (id) 将用于区分正确项目的 FilesForUpdate 对象。

// Function to display details of the media file
var FilesForUpdate = null;

function onMediaFileListSuccess(Files) {
	var name = document.getElementById('MediaNameText').value;

    if (!name) {
		console.log('Error: Incorrect media file name');
		return;
	}
    //make a copy of "Files" to update one of selected
    FilesForUpdate = Files;
    console.log('Files found...');
    for ( var i in Files) {
	var File = Files[i];
	if (File.title == name) {
		output.append('File name: ' + File.title);
		output.append('File type: ' + File.type);
		output.append('File identifier: ' + File.id);
		output.append('File mimeType: ' + File.mimeType);
		output.append('File releaseDate: ' + File.releaseDate);
		output.append('File modifiedDate: ' + File.modifiedDate);
		output.append('File description: ' + File.description);
		output.append('File rating: ' + File.rating);
		for ( var j in File.thumbnailURIs) {
			output.append('File thumbnailURI: ' + File.thumbnailURIs[j]);
		}
		switch (File.type) {
       		   case 'IMAGE':
 			RetrieveImageInfo(File);
			break;
		   case 'VIDEO':
			RetrieveVideoInfo(File);
			break;
		   case 'AUDIO':
			RetrieveAudioInfo(File);
			break;
		 }

	// create Update buttons
           output.append("<button onclick=\"updateFile(" + i
                    + ")\">Update File " + File.title + "</button>");
			return;
		}
	}
	console.log("File " + name + " not found...");
}

以下函数已实施以打印其余的"文件"的特定属性。 每个函数将显示文件的详细信息,具体取决于其媒体格式 (图像/音频/视频)。

// Function to display Image attribute details
function RetrieveImageInfo(item) {
	try {
		output.append('Item width: ' + item.width);
		output.append('Item height: ' + item.height);
		output.append('Item location, latitude: ' + item.geolocation.latitude);
		output.append('Item location, longitude: ' + item.geolocation.longitude);
	} catch (e) {
		onError(e);
	}
}

// Function to display Video attribute details
function RetrieveVideoInfo(item) {
	try {
		output.append('Item album: ' + item.album);
		for ( var i in item.artists) {
			output.append('Item artist: ' + item.artists[i]);
		}
		output.append('Item duration: ' + item.duration);
		output.append('Item width: ' + item.width);
		output.append('Item height: ' + item.height);
		output.append('Item playedTime: ' + item.playedTime);
		output.append('Item playCount: ' + item.playCount);
	} catch (e) {
		onError(e);
	}
}

// Function to display audio attribute details
function RetrieveAudioInfo(item) {
	try {
		output.append('Item album: ' + item.album);
		for ( var i in item.artists)
			output.append('Item artist: ' + item.artists[i]);
		for ( var i in item.composers)
			output.append('Item composer: ' + item.composers[i]);
		for ( var i in item.genres)
			output.append('Item genre: ' + item.genres[i]);

		output.append('Item lyrics type: ' + item.lyrics.type);
		output.append('Item lyrics timeStamps: ' + item.lyrics.timeStamps);
		output.append('Item lyrics texts: ' + item.lyrics.texts);

		output.append('Item copyright: ' + item.copyright);
		output.append('Item bitrate: ' + item.bitrate);

		output.append('Item trackNumber: ' + item.trackNumber);
		output.append('Item duration: ' + item.duration);
		output.append('Item size: ' + item.size);
		output.append('Item playedTime: ' + item.playedTime);
		output.append('Item playCount: ' + item.playCount);

	} catch (e) {
		onError(e);
	}
}

更新项目

可以用 MediaSource.update 方法更新媒体项的数据属性。 该示例阐释如何检查特定的属性是否可编辑和更新属性。

// Function to update a file attribute
function updateFile(id) {
	try {
		if (FilesForUpdate[id].type == 'IMAGE') {
			FilesForUpdate[id].rating += 1;
			output.set('Increased rating attribute');
		} else {
			FilesForUpdate[id].playCount++;
			output.set('Increased playCount attribute');
		}

	    try {
	    	mSource.update(FilesForUpdate[id]);
	    } catch(error) {
	    	onError(error);
	    }
	} catch (e) {
		onError(e);
	}
}

function onUpdateSuccess() {
	output.append("Item updated");
}

屏幕抓图:

当查询目录。

开发环境:

Tizen SDK

版本:2.2.0
构建 id: 20130708-1957

注:
内容 API 示例应用程序是可供参考 (见附件的文件信息部分)。

文件附件: