Skip to content

Most visited

Recently visited

navigation
BeamLargeFiles / src / com.example.android.common / assetprovider /

AssetProvider.java

1
/*
2
* Copyright (C) 2013 The Android Open Source Project
3
*
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
7
*
8
*      http://www.apache.org/licenses/LICENSE-2.0
9
*
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
15
*/
16
 
17
package com.example.android.common.assetprovider;
18
 
19
import android.content.ContentProvider;
20
import android.content.ContentValues;
21
import android.content.Context;
22
import android.content.res.AssetFileDescriptor;
23
import android.content.res.AssetManager;
24
import android.database.Cursor;
25
import android.net.Uri;
26
 
27
import java.io.FileNotFoundException;
28
import java.io.IOException;
29
 
30
import static java.net.URLConnection.guessContentTypeFromName;
31
 
32
/**
33
 * Generic content provider, which makes any files available in this app's "assets" directory
34
 * available publicly.
35
 *
36
 * <p>To use, add the following to your AndroidManifest.xml:
37
 *
38
 * <code><pre>
39
 * <provider
40
 *   android:name=".AssetProvider"
41
 *   android:authorities="[YOUR CONTENT PROVIDER DOMAIN HERE]"
42
 *   android:exported="true"/>
43
 * </pre></code>
44
 */
45
public class AssetProvider extends ContentProvider {
46
    AssetManager mAssets;
47
 
48
    @Override
49
    public boolean onCreate() {
50
        Context ctx = getContext();
51
        if (ctx == null) {
52
            // Context not available. Give up.
53
            return false;
54
        }
55
        mAssets = ctx.getAssets();
56
        return true;
57
    }
58
 
59
    @Override
60
    public String getType(Uri uri){
61
        // Returns the MIME type for the selected URI, in conformance with the ContentProvider
62
        // interface. Looks up the file indicated by /res/assets/{uri.path}, and returns the MIME
63
        // type for that file as guessed by the URLConnection class.
64
 
65
        // Setup
66
        String path = uri.getPath();
67
 
68
        // Check if file exists
69
        if (!fileExists(path)) {
70
            return null;
71
        }
72
 
73
        // Determine MIME-type based on filename
74
        return guessContentTypeFromName(uri.toString());
75
    }
76
 
77
 
78
    @Override
79
    public AssetFileDescriptor openAssetFile (Uri uri, String mode)
80
            throws FileNotFoundException, SecurityException {
81
        // ContentProvider interface for opening a file descriptor by URI. This content provider
82
        // maps all URIs to the contents of the APK's assets folder, so a file handle to
83
        // /res/assets/{uri.path} will be returned.
84
 
85
        // Security check. This content provider only supports read-only access. (Also, the contents
86
        // of an APKs assets folder are immutable, so read-write access doesn't make sense here.)
87
        if (!"r".equals(mode)) {
88
            throw new SecurityException("Only read-only access is supported, mode must be [r]");
89
        }
90
 
91
        // Open asset from within APK and return file descriptor
92
        String path = uri.getPath();
93
        try {
94
            return mAssets.openFd(path);
95
        } catch (IOException e) {
96
            throw new FileNotFoundException();
97
        }
98
    }
99
 
100
    /**
101
     * Check if file exists inside APK assets.
102
     *
103
     * @param path Fully qualified path to file.
104
     * @return true if exists, false otherwise.
105
     */
106
    private boolean fileExists(String path) {
107
        try {
108
            // Check to see if file can be opened. If so, file exists.
109
            mAssets.openFd(path).close();
110
            return true;
111
        } catch (IOException e) {
112
            // Unable to open file descriptor for specified path; file doesn't exist.
113
            return false;
114
        }
115
    }
116
 
117
    // Required/unused ContentProvider methods below.
118
    @Override
119
    public Cursor query(Uri uri, String[] projection, String selection,
120
                        String[] selectionArgs, String sortOrder) {
121
        // Note: It might be worth implementing support for querying
122
        //       android.provider.OpenableColumns here in the future.
123
        throw new RuntimeException("Operation not supported");
124
    }
125
 
126
    @Override
127
    public Uri insert(Uri uri, ContentValues contentValues) {
128
        throw new RuntimeException("Operation not supported");
129
    }
130
 
131
    @Override
132
    public int delete(Uri uri, String selection, String[] selectionArgs) {
133
        throw new RuntimeException("Operation not supported");
134
    }
135
 
136
    @Override
137
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
138
        throw new RuntimeException("Operation not supported");
139
    }
140
}
This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.