- 浏览: 1055098 次
- 性别:
- 来自: 南昌
文章分类
- 全部博客 (276)
- 生活 (1)
- 代码之美 (22)
- Media (7)
- Android Widget (3)
- Android Intent (1)
- Android Activity (4)
- UI event handle--UI事件处理机制 (2)
- Java基础知识 (12)
- android Databases (5)
- Android 系统知识 (70)
- 平常遇到的问题与解决方法 (38)
- Android TextView/EditView (2)
- Thinking Java (1)
- android webkit (6)
- JSON (1)
- XML (4)
- HTTP (1)
- Google Weather API (1)
- android 2.3 NFC (10)
- android app (20)
- android framework (7)
- C++ (2)
- android System (5)
- Pthread (1)
- Wifi (8)
- Unix/Linux C (8)
- Android 4.0 (1)
- Mail (1)
- Smack 源码学习 (4)
- iOS (4)
- Android (1)
- git (1)
- Gallery3d (2)
- React-Natice (1)
最新评论
-
dd18349182956:
你是用的smack哪个版本?我用的smack4.1.3和sma ...
关于socket长连接的心跳包 -
xukaiyin:
全英文
getApplicationContext()与this,getBaseContext() -
裂风矢:
...
<category android:name="android.intent.category.DEFAULT" /> 惹的祸 -
xanthodont:
mark一下
XMPP——Smack -
Evilover3:
mark一下,学习了
XMPP——Smack
转自http://www.linuxidc.com/Linux/2015-03/114754.htm
系统媒体库不了解的线看这儿:
Android media媒体库分析之:MediaProvider http://www.linuxidc.com/Linux/2015-03/114755.htm
Android media媒体库分析之:调用系统媒体库完成指定媒体文件扫描 http://www.linuxidc.com/Linux/2015-03/114756.htm
先看一下要实现的效果:
上图是系统设置中分类别对文件所占空间的统计,项目中要统计媒体文件所占空间,于是研究了一下系统的做法,收获如下:
1、从源码packages/app/下找到settings工程,找到存储功能的实现,相关类有:
com.android.settings.deviceinfo.StorageMeasurement
com.android.settings.deviceinfo.StorageVolumePreferenceCategory
其他相关源码:
com.android.defcontainer.DefaultContainerService
StorageMeasurement类中启动服务,绑定服务,通知界面更新;
StorageVolumePreferenceCategory显示界面
StorageMeasurement中建立了与DefaultContainerService服务的通信,指定要扫描的目录:
/** Media types to measure on external storage. */
private static final Set<String> sMeasureMediaTypes = Sets.newHashSet(
Environment.DIRECTORY_DCIM, Environment.DIRECTORY_MOVIES,
Environment.DIRECTORY_PICTURES, Environment.DIRECTORY_MUSIC,
Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS,
Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_PODCASTS,
Environment.DIRECTORY_DOWNLOADS, Environment.DIRECTORY_ANDROID);
上面这个set就是定义了我们系统里面常用的目录:
public static String DIRECTORY_DOWNLOADS = "Download";
public static String DIRECTORY_DCIM = "DCIM";
public static String DIRECTORY_MUSIC = "Music";
public static String DIRECTORY_PICTURES = "Pictures";
public static String DIRECTORY_MOVIES = "Movies";
...
获取每个目录的大小:
for (String type : sMeasureMediaTypes) {
final File path = currentEnv.getExternalStoragePublicDirectory(type);
final long size = getDirectorySize(imcs, path);
details.mediaSize.put(type, size);
}
其中getDirectorySize方法通过IMediaContainerService调用了DefaultContainerService服务中的方法,在DefaultContainerService中获取到所有信息之后回调IMediaContainerService,再更新界面;
也就是说:系统只统计了上述几个目录的大小(sMeasureMediaTypes中定义的),如果你的歌曲是拷贝到其他目录,那系统存储里面是不会统计使用量。看来Android也不是很智能嘛!!!难度是考虑效率???
2、如何获取某个目录的大小?
先看一下系统是怎么做的:
下面方法是在DefaultContainerService中定义的,获取某一目录大小,获取某一文件大小;
@Override
public long calculateDirectorySize(String path) throws RemoteException {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
final File directory = new File(path);
if (directory.exists() && directory.isDirectory()) {
return MeasurementUtils.measureDirectory(path);
} else {
return 0L;
}
}
@Override
public long[] getFileSystemStats(String path) {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
try {
final StructStatFs stat = Libcore.os.statfs(path);
final long totalSize = stat.f_blocks * stat.f_bsize;
final long availSize = stat.f_bavail * stat.f_bsize;
return new long[] { totalSize, availSize };
} catch (ErrnoException e) {
throw new IllegalStateException(e);
}
}
但是
MeasurementUtils.measureDirectory(path)和Libcore.os.statfs(path)
两个方法我们都调不到,怎么办?
我们把MeasurementUtils类从源码中拷贝出来到我们的功能,但注意要保留包路径,否则可以编译通过,但无法运行,因为他里面用到了一个本地方法,需要加载一个so文件。如下:
这样就可以解决第一个问题了;
再来看第二方法,其实这个方法我们用不到,我们已经通过第一个方法获取到指定文件夹的大小了,那关于某一个文件的大小我们之间通过file可以拿到。
第二个方法有一个封装类:starfs,可以获取rom、sdcard的总大小和可用空间,如下:
/**
* The size, in bytes, of a block on the file system. This corresponds to
* the Unix {@code statfs.f_bsize} field.
*/
public int getBlockSize() {
return (int) mStat.f_bsize;
}
/**
* The total number of blocks on the file system. This corresponds to the
* Unix {@code statfs.f_blocks} field.
*/
public int getBlockCount() {
return (int) mStat.f_blocks;
}
这个可以直接在我们获取总体容量时使用。
上面把系统是怎么做的大概搞清楚,下面我们来实现我们的需求:
一、思路:
1、Android media媒体库分析之:调用系统媒体库完成指定媒体文件扫描 http://www.linuxidc.com/Linux/2015-03/114756.htm
这篇文章可以知道,媒体文件(音频、视频、图片)系统完成扫描之后就存入了数据库,那我们可以查询数据库,得到所有媒体文件,把这些文件的大小相加。
2、由于sdcard可以会unmount,所以在相加时要根据路径判断此文件是否存在;
3、下面时我实现的工具类,希望对你有用:
package com.linuxidc.jerome;
import java.io.File;
import java.util.ArrayList;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.os.StatFs;
import android.provider.MediaStore;
public class MemoryUtil {
Context mContext;
public MemoryUtil(Context context) {
mContext = context;
}
/**
* 获得SD卡总大小
*
* @return
*/
public long getSDTotalSize() {
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
return blockSize * totalBlocks;
}
/**
* 获得sd卡剩余容量,即可用大小
*
* @return
*/
public long getSDAvailableSize() {
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return blockSize * availableBlocks;
}
/**
* 获得机身内存总大小
*
* @return
*/
public long getRomTotalSize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
return blockSize * totalBlocks;
}
/**
* 获得机身可用内存
*
* @return
*/
public long getRomAvailableSize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return blockSize * availableBlocks;
}
/**
* 外部存储中所有音频文件所占内存
*
* @return
*/
public long getAudioTotalSize() {
ArrayList<MemoryInfo> resultList = queryAllMediaList(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
long size = 0L;
for (MemoryInfo cInfo : resultList) {
File file = new File(cInfo.getFilePath());
if(null!=file &&file.exists()){
size += cInfo.getFileSize();
}
}
return size;
}
/**
* 外部存储中除音频、视频、图片之前其他文件所占内存
*
* @return
*/
public long getOtherTotalSize() {
long size = getSDTotalSize() - getSDAvailableSize()
- getPictureTotalSize() - getVideoTotalSize()
- getAudioTotalSize();
if (size < 0L) {
size = 0L;
}
return size;
}
/**
* 外部存储中所有图片文件所占内存
*
* @return
*/
public long getPictureTotalSize() {
ArrayList<MemoryInfo> resultList = queryAllMediaList(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
long size = 0L;
for (MemoryInfo cInfo : resultList) {
File file = new File(cInfo.getFilePath());
if(null!=file &&file.exists()){
size += cInfo.getFileSize();
}
}
return size;
}
/**
* 外部存储中所有视频文件所占内存
*
* @return
*/
public long getVideoTotalSize() {
ArrayList<MemoryInfo> resultList = queryAllMediaList(MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
long size = 0L;
for (MemoryInfo cInfo : resultList) {
File file = new File(cInfo.getFilePath());
if(null!=file &&file.exists()){
size += cInfo.getFileSize();
}
}
return size;
}
public ArrayList<MemoryInfo> queryAllMediaList(Uri uri) {
//我们只需要两个字段:大小、文件路径
Cursor cursor = mContext.getContentResolver().query(
uri,new String[] { MediaStore.Audio.Media.SIZE,
MediaStore.Audio.Media.DATA }, null, null, null);
ArrayList<MemoryInfo> musicList = new ArrayList<MemoryInfo>();
try{
if (cursor.moveToFirst()) {
do {
MemoryInfo mInfo = new MemoryInfo();
mInfo.setFileSize(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE)));
mInfo.setFilePath(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)));
}while(cursor.moveToNext());
}
}finally{
if(cursor != null){
cursor.close();
}
}
return musicList;
}
class MemoryInfo {
private long fileSize = 0L;
private String filePath = "";
public long getFileSize() {
return fileSize;
}
public void setFileSize(long fileSize) {
this.fileSize = fileSize;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
}
}
系统媒体库不了解的线看这儿:
Android media媒体库分析之:MediaProvider http://www.linuxidc.com/Linux/2015-03/114755.htm
Android media媒体库分析之:调用系统媒体库完成指定媒体文件扫描 http://www.linuxidc.com/Linux/2015-03/114756.htm
先看一下要实现的效果:
上图是系统设置中分类别对文件所占空间的统计,项目中要统计媒体文件所占空间,于是研究了一下系统的做法,收获如下:
1、从源码packages/app/下找到settings工程,找到存储功能的实现,相关类有:
com.android.settings.deviceinfo.StorageMeasurement
com.android.settings.deviceinfo.StorageVolumePreferenceCategory
其他相关源码:
com.android.defcontainer.DefaultContainerService
StorageMeasurement类中启动服务,绑定服务,通知界面更新;
StorageVolumePreferenceCategory显示界面
StorageMeasurement中建立了与DefaultContainerService服务的通信,指定要扫描的目录:
/** Media types to measure on external storage. */
private static final Set<String> sMeasureMediaTypes = Sets.newHashSet(
Environment.DIRECTORY_DCIM, Environment.DIRECTORY_MOVIES,
Environment.DIRECTORY_PICTURES, Environment.DIRECTORY_MUSIC,
Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS,
Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_PODCASTS,
Environment.DIRECTORY_DOWNLOADS, Environment.DIRECTORY_ANDROID);
上面这个set就是定义了我们系统里面常用的目录:
public static String DIRECTORY_DOWNLOADS = "Download";
public static String DIRECTORY_DCIM = "DCIM";
public static String DIRECTORY_MUSIC = "Music";
public static String DIRECTORY_PICTURES = "Pictures";
public static String DIRECTORY_MOVIES = "Movies";
...
获取每个目录的大小:
for (String type : sMeasureMediaTypes) {
final File path = currentEnv.getExternalStoragePublicDirectory(type);
final long size = getDirectorySize(imcs, path);
details.mediaSize.put(type, size);
}
其中getDirectorySize方法通过IMediaContainerService调用了DefaultContainerService服务中的方法,在DefaultContainerService中获取到所有信息之后回调IMediaContainerService,再更新界面;
也就是说:系统只统计了上述几个目录的大小(sMeasureMediaTypes中定义的),如果你的歌曲是拷贝到其他目录,那系统存储里面是不会统计使用量。看来Android也不是很智能嘛!!!难度是考虑效率???
2、如何获取某个目录的大小?
先看一下系统是怎么做的:
下面方法是在DefaultContainerService中定义的,获取某一目录大小,获取某一文件大小;
@Override
public long calculateDirectorySize(String path) throws RemoteException {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
final File directory = new File(path);
if (directory.exists() && directory.isDirectory()) {
return MeasurementUtils.measureDirectory(path);
} else {
return 0L;
}
}
@Override
public long[] getFileSystemStats(String path) {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
try {
final StructStatFs stat = Libcore.os.statfs(path);
final long totalSize = stat.f_blocks * stat.f_bsize;
final long availSize = stat.f_bavail * stat.f_bsize;
return new long[] { totalSize, availSize };
} catch (ErrnoException e) {
throw new IllegalStateException(e);
}
}
但是
MeasurementUtils.measureDirectory(path)和Libcore.os.statfs(path)
两个方法我们都调不到,怎么办?
我们把MeasurementUtils类从源码中拷贝出来到我们的功能,但注意要保留包路径,否则可以编译通过,但无法运行,因为他里面用到了一个本地方法,需要加载一个so文件。如下:
这样就可以解决第一个问题了;
再来看第二方法,其实这个方法我们用不到,我们已经通过第一个方法获取到指定文件夹的大小了,那关于某一个文件的大小我们之间通过file可以拿到。
第二个方法有一个封装类:starfs,可以获取rom、sdcard的总大小和可用空间,如下:
/**
* The size, in bytes, of a block on the file system. This corresponds to
* the Unix {@code statfs.f_bsize} field.
*/
public int getBlockSize() {
return (int) mStat.f_bsize;
}
/**
* The total number of blocks on the file system. This corresponds to the
* Unix {@code statfs.f_blocks} field.
*/
public int getBlockCount() {
return (int) mStat.f_blocks;
}
这个可以直接在我们获取总体容量时使用。
上面把系统是怎么做的大概搞清楚,下面我们来实现我们的需求:
一、思路:
1、Android media媒体库分析之:调用系统媒体库完成指定媒体文件扫描 http://www.linuxidc.com/Linux/2015-03/114756.htm
这篇文章可以知道,媒体文件(音频、视频、图片)系统完成扫描之后就存入了数据库,那我们可以查询数据库,得到所有媒体文件,把这些文件的大小相加。
2、由于sdcard可以会unmount,所以在相加时要根据路径判断此文件是否存在;
3、下面时我实现的工具类,希望对你有用:
package com.linuxidc.jerome;
import java.io.File;
import java.util.ArrayList;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.os.StatFs;
import android.provider.MediaStore;
public class MemoryUtil {
Context mContext;
public MemoryUtil(Context context) {
mContext = context;
}
/**
* 获得SD卡总大小
*
* @return
*/
public long getSDTotalSize() {
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
return blockSize * totalBlocks;
}
/**
* 获得sd卡剩余容量,即可用大小
*
* @return
*/
public long getSDAvailableSize() {
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return blockSize * availableBlocks;
}
/**
* 获得机身内存总大小
*
* @return
*/
public long getRomTotalSize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
return blockSize * totalBlocks;
}
/**
* 获得机身可用内存
*
* @return
*/
public long getRomAvailableSize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return blockSize * availableBlocks;
}
/**
* 外部存储中所有音频文件所占内存
*
* @return
*/
public long getAudioTotalSize() {
ArrayList<MemoryInfo> resultList = queryAllMediaList(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
long size = 0L;
for (MemoryInfo cInfo : resultList) {
File file = new File(cInfo.getFilePath());
if(null!=file &&file.exists()){
size += cInfo.getFileSize();
}
}
return size;
}
/**
* 外部存储中除音频、视频、图片之前其他文件所占内存
*
* @return
*/
public long getOtherTotalSize() {
long size = getSDTotalSize() - getSDAvailableSize()
- getPictureTotalSize() - getVideoTotalSize()
- getAudioTotalSize();
if (size < 0L) {
size = 0L;
}
return size;
}
/**
* 外部存储中所有图片文件所占内存
*
* @return
*/
public long getPictureTotalSize() {
ArrayList<MemoryInfo> resultList = queryAllMediaList(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
long size = 0L;
for (MemoryInfo cInfo : resultList) {
File file = new File(cInfo.getFilePath());
if(null!=file &&file.exists()){
size += cInfo.getFileSize();
}
}
return size;
}
/**
* 外部存储中所有视频文件所占内存
*
* @return
*/
public long getVideoTotalSize() {
ArrayList<MemoryInfo> resultList = queryAllMediaList(MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
long size = 0L;
for (MemoryInfo cInfo : resultList) {
File file = new File(cInfo.getFilePath());
if(null!=file &&file.exists()){
size += cInfo.getFileSize();
}
}
return size;
}
public ArrayList<MemoryInfo> queryAllMediaList(Uri uri) {
//我们只需要两个字段:大小、文件路径
Cursor cursor = mContext.getContentResolver().query(
uri,new String[] { MediaStore.Audio.Media.SIZE,
MediaStore.Audio.Media.DATA }, null, null, null);
ArrayList<MemoryInfo> musicList = new ArrayList<MemoryInfo>();
try{
if (cursor.moveToFirst()) {
do {
MemoryInfo mInfo = new MemoryInfo();
mInfo.setFileSize(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE)));
mInfo.setFilePath(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)));
}while(cursor.moveToNext());
}
}finally{
if(cursor != null){
cursor.close();
}
}
return musicList;
}
class MemoryInfo {
private long fileSize = 0L;
private String filePath = "";
public long getFileSize() {
return fileSize;
}
public void setFileSize(long fileSize) {
this.fileSize = fileSize;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
}
}
发表评论
-
打印调用堆栈
2019-11-15 15:48 440平常我们遇到不清楚代码逻辑的,可以通过打印调用堆栈来理清楚,如 ... -
你知道Log.isLoggable
2018-11-23 14:15 830我们可以通过Log.isLoggable来动态开关log的输出 ... -
android:allowUndo
2018-04-25 16:51 749Android 在Android 23增加了UndoManag ... -
mipmap-xxx
2015-12-10 11:35 1060最近在看AOSP,发现mipmaps, 百度 了一下,发现有各 ... -
《Android.Programming.Pushing.the.Limits].Erik.Hellman》记录1
2015-10-29 10:56 549最近在看《Android.Programming.Pushin ... -
System.currentTimeMillis() uptimeMillis elapsedRealtime 区别
2015-10-28 20:02 1269转自http://blog.csdn.net/wutianyi ... -
GPS的开关设置
2015-09-29 18:36 1977//modify by hyxu 2015-9-30 to s ... -
DialogFragment
2015-09-25 13:56 1005public class YesNoDialog extend ... -
ANDROID L——RecyclerView,CardView导入和使用
2015-07-23 09:51 912转自http://blog.csdn.net/a3969019 ... -
IntentService 和ResultReceiver
2015-07-22 20:00 784转自[url] http://javatechig.com/a ... -
java.lang.IllegalArgumentException: Service Intent must be explicit
2015-07-21 20:03 1277转自:http://www.2cto.com/kf/20150 ... -
Context 和Application Context
2015-02-11 15:14 862http://possiblemobile.com/2013/ ... -
ContentProviderOperation.Builder 中withValue和withValueBackReference的区别
2015-02-10 14:01 2174关于ContentProviderOperation.Buil ... -
AndroidManifest.xml的Service元素 android:process设置
2013-05-30 17:02 11459转自:http://galin.blog.sohu ... -
android中打包含有Activity以及资源文件的jar包在工程中调用
2013-05-28 15:00 1293转自:http://www.cnblogs.com/vaiya ... -
Android杂谈--内存泄露(1)--contentView缓存使用与ListView优化
2012-11-01 09:29 2799转自:http://www.cnblogs.com/louli ... -
Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
2012-10-31 14:32 1853转自:http://www.eoeandroid.com/th ... -
Animation
2012-10-30 13:41 1108转自:http://hi.baidu.com/wendaoer ... -
Android onTouchEvent和onInterceptTouchEvent
2012-10-24 15:05 1259ViewGroup里的onInterceptTouchEven ... -
Android 内存管理的相关知识
2012-10-15 14:03 1137最近在读柯元旦的《Android 内核剖析》一书的“内存管理” ...
相关推荐
Android MediaProjection截屏&录屏 1、解决Android Q中java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION 异常 2、...
wp-sync-db-media-files, 在WordPress安装之间同步媒体库一个插件同步数据库插件 同步DB媒体文件用于 WP同步数据库插件的插件,允许你在WordPress安装之间同步媒体库。
演示:android-media-picker,一个简单易用的媒体选择器android库。从设备中选择任何图像、视频或音频.zip
Android多媒体构架分析 Ice-cream Sandwich(ICS)Media Analysis Report 英本交于内部资料,讲的挺详细的,希望对大家有帮助
android media development,安卓多媒体开发,http://t.cn/zOAdUM4
android Media分析android Media分析android Media分析
1.更新多媒体数据库,类似Media Scanner 2.通过MediaStore 获取多媒体的meta 数据。
JAVA程序通过JNI接口实现对底层媒体库libmedia.so的调用; MediaPlayer在运行的时候,可以大致上分成Client和Server两个部分,它们分别在两个进程中运行,它们之间使用Binder机制实现IPC通讯,图中...
一个很好的ppt 介绍Android的media framework 非常详细 帮助你更好理解 Android的多媒体框架
Android Studio New Media Fundamentals:...Chapter 10: 3D New Media: Concepts and Terminology Chapter 11: 3D New Media: Data Formats and Platforms Chapter 12: Referencing New Media Assets in Android Studio
S3-Media-Storage, 使用AmazonS3存储和服务媒体库资产的WordPress插件 S3媒体存储贡献者:Anthony Gentile标记:S3,媒体,图像要求至少:3.0测试到:3.6稳定标记:1.0.3许可证:GPLv2或者更高版本S3媒体存储...
Android的媒体库,用于选择单个/多个媒体文件(图像/视频/音频)。 设置 步骤1:添加依赖项 dependencies { .. . /* media picker */ implementation ' com.greentoad.turtlebody:media-picker:1.0.8 ' /* ...
媒体模块描述访问android媒体商店[图像,视频,缩略图,音频文件]访问媒体模块要从JavaScript访问此模块,您需要执行以下操作: var media = require("com.mykingdom.media");media变量是对Module对象的引用。参考...
很好的android media实例资源
Win7无法向Windows Media Player媒体库添文件?.docx
android-media-fingerprint 一个为媒体文件创建指纹的库例子: ImageFingerprinter fingerprinter = new PerceptualHashFingerprinter();long fingerprint1 = fingerprinter.create(bitmap1);long fingerprint2 = ...
wp-media-grid-view, WordPress媒体库的网格视图 wp-media-grid-view用网格替换媒体库视图的媒体列表。
由于文件大小的限制,BIN目录没有被打包进来,使用的时候大家注意将layout目录和src目录的相关文件添加你的项目中,并注意 根目录的AndroidManifest.xml的配置。欢迎有兴趣开发基于android的中英文语言学习系统的跟...
Pro Android Media.pdf英文版
Android TV Apps Development: Building Media and Games will demystify some of the newest APIs and present the tools necessary for building applications that run on Android TV. Walking through example...