/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ package com.example.android.justforus; import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log; import java.io.FileNotFoundException;
import java.io.IOException; import static java.net.URLConnection.guessContentTypeFromName; /**
* Generic content provider, which makes any files available in this app's "assets" directory
* available publicly.
*
* <p>To use, add the following to your AndroidManifest.xml:
*
* <code><pre>
* <provider
* android:name=".AssetProvider"
* android:authorities="[YOUR CONTENT PROVIDER DOMAIN HERE]"
* android:grantUriPermissions="true"
* android:exported="true"/>
* </pre></code>
*/
public class AssetProvider extends ContentProvider { /**
* Content provider authority that identifies data that is offered by this
* {@link AssetProvider}.
*/
public static String CONTENT_URI = "com.example.android.justforus"; private static final String TAG = "AssetProvider"; AssetManager mAssets; @Override
public boolean onCreate() {
Context ctx = getContext();
if (ctx == null) {
// Context not available. Give up.
return false;
}
mAssets = ctx.getAssets();
return true;
} @Override
public String getType(Uri uri){
// Returns the MIME type for the selected URI, in conformance with the ContentProvider
// interface. Looks up the file indicated by /res/assets/{uri.path}, and returns the MIME
// type for that file as guessed by the URLConnection class. // Setup
String path = uri.getLastPathSegment(); // Check if file exists
if (!fileExists(path)) {
return null;
} // Determine MIME-type based on filename
return guessContentTypeFromName(uri.toString());
} @Override
public AssetFileDescriptor openAssetFile (Uri uri, String mode)
throws FileNotFoundException, SecurityException {
// ContentProvider interface for opening a file descriptor by URI. This content provider
// maps all URIs to the contents of the APK's assets folder, so a file handle to
// /res/assets/{uri.path} will be returned. // Security check. This content provider only supports read-only access. (Also, the contents
// of an APKs assets folder are immutable, so read-write access doesn't make sense here.)
if (!"r".equals(mode)) {
throw new SecurityException("Only read-only access is supported, mode must be [r]");
} // Open asset from within APK and return file descriptor
String path = uri.getLastPathSegment();
try {
return mAssets.openFd(path);
} catch (IOException e) {
throw new FileNotFoundException();
}
} /**
* Check if file exists inside APK assets.
*
* @param path Fully qualified path to file.
* @return true if exists, false otherwise.
*/
private boolean fileExists(String path) {
try {
// Check to see if file can be opened. If so, file exists.
mAssets.openFd(path).close();
return true;
} catch (IOException e) {
// Unable to open file descriptor for specified path; file doesn't exist.
return false;
}
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
String path = uri.getLastPathSegment();
if (!fileExists(path)) {
Log.e(TAG, "Requested file doesn't exist at " + path);
return null;
} // Create matrix cursor
if (projection == null) {
projection = new String[]{
OpenableColumns.DISPLAY_NAME,
OpenableColumns.SIZE,
};
} MatrixCursor matrixCursor = new MatrixCursor(projection, 1);
Object[] row = new Object[projection.length];
for (int col = 0; col < projection.length; col++) {
if (OpenableColumns.DISPLAY_NAME.equals(projection[col])) {
row[col] = path;
} else if (OpenableColumns.SIZE.equals(projection[col])) {
try {
AssetFileDescriptor afd = openAssetFile(uri, "r");
if (afd != null) {
row[col] = Long.valueOf(afd.getLength());
}
afd.close();
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}
}
matrixCursor.addRow(row);
return matrixCursor;
} // Required/unused ContentProvider methods below.
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
throw new RuntimeException("Operation not supported");
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
throw new RuntimeException("Operation not supported");
} @Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
throw new RuntimeException("Operation not supported");
}
}

  

Android Assert工具类的更多相关文章

  1. 53. Android常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefer ...

  2. Android 常见工具类封装

    1,MD5工具类: public class MD5Util { public final static String MD5(String s) { char hexDigits[] = { '0' ...

  3. 【转】Android常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefe ...

  4. Spring的Assert工具类的用法

    简介 今天在看spring mvc源码时看到下面代码,感觉蛮有意思的,在这里记录下 Assert断言工具类,通常用于数据合法性检查,在JAVA编程中,通常会编写如下代码: if (name == nu ...

  5. Android基础工具类重构系列一Toast

    前言: 一直在考虑写一下Android实际项目中的一些总结,翻看CSDN博客,上一篇已经是一年多曾经. 本系列定位Android基础工具类重构.旨在记录实际项目中经经常使用到的一些工具类,比方Toas ...

  6. (转载)android 一些工具类汇总

    android 一些工具类汇总 作者:曾田生z 字体:[增加 减小] 类型:转载 时间:2016-08-14我要评论 本文给大家汇总介绍了一些常用的Android工具类,非常的简单实用,有需要的小伙伴 ...

  7. 随笔分类 - Android之工具类

    Android之文件搜索工具类 /** * @detail 搜索sdcard文件 * @param 需要进行文件搜索的目录 * @param 过滤搜索文件类型 */ private void sear ...

  8. Android 系统工具类SystemUtils

    包含的功能有: 获取系统中所有APP应用.获取用户安装的APP应用.根据包名和Activity启动类查询应用信息.跳转到WIFI设置.WIFI网络开关.移动网络开关.GPS开关 当前若关则打开 当前若 ...

  9. Android Sqlite 工具类封装

    鉴于经常使用 Sqlite 数据库做数据持久化处理,进行了一点封装,方便使用. 该封装类主要支持一下功能 支持多用户数据储存 支持 Sqlite数据库升级 支持传入 Sql 语句建表 支持 SQLit ...

随机推荐

  1. php 出现 500 Internal Server Error错误问题解决

    set_time_limit(0); //设置超时时间 chmod 777 filename //设置文件权限 问题根本不在这,读取数据太多,数组是很站内存的. 内存设置大些就ok了 ini_set( ...

  2. numpy库:常用基本

    numpy 本文主要列出numpy模块常用方法 大部分内容来源于网络,而后经过自己的一点思考和总结,如果有侵权,请联系我 我是一名初学者,有哪些地方有错误请留言,我会及时更改的 创建矩阵(采用ndar ...

  3. 数塔(dp)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  4. JavaScript事件处理

    客户端javascript程序采用了异步事件驱动程序,在这种程序设计风格下,当文档,浏览器,元素,或与之相关的对象发生某些有趣的事件时,web浏览器就会产生事件.事件本身不是javascript对象. ...

  5. PMBOK 项目管理 九大知识领域和五大流程 PMI

    Project Management Institute.PMI 是世界上最大的非盈利机构,是项目管理领域的领导者.PMI制定项目管理行业标准,带领项目管理的研究并提供项目管理的培训,证书,还有一些加 ...

  6. Linux系统目录/bin /sbin /usr/bin /usr/sbin和/lib /usrlib的一些分析

    其实就是相当于转载了. /bin,/sbin,/usr/sbin,/usr/bin 目录 这些目录都是存放命令的,首先区别下/sbin和/bin: 从命令功能来看,/sbin 下的命令属于基本的系统命 ...

  7. sqlserver 创建索引

    语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名)WITH FILLFACTOR = 填充因子值0~100GO /*实例*/  CREATE NONCLUSTERED INDEX ...

  8. 为 Python Server Pages 和 Oracle 构建快速 Web 开发环境。

    为 Python Server Pages 和 Oracle 构建快速 Web 开发环境. - 在水一方 - 博客频道 - CSDN.NET 为 Python Server Pages 和 Oracl ...

  9. IP、路由配置

    IP地址组成: 网络地址主机地址32位二进制 A类: 255.0.0.0, 8:    0 000 0001 - 0 111 1111     127个A类,127用于回环,1-126    2^7- ...

  10. IOS 掉用系统发短信

    #import <MessageUI/MessageUI.h> MFMessageComposeViewControllerDelegate #pragma mark - 调用ios系统短 ...