抛出:IllegalArgumentException:未知的URL内容://内容 [英] IllegalArgumentException: Unknown URL content:// CONTENT

查看:263
本文介绍了抛出:IllegalArgumentException:未知的URL内容://内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

抛出:IllegalArgumentException:未知的URL内容://

^经与上述的噩梦。我检查了我的变量和路径,但不能看到的问题是什么呢?大大AP preciate任何指针!

下面是我的痕迹。

  java.lang.IllegalArgumentException异常:未知网址
 内容://com.purewowstudio.topmovies.data.FilmProvider/film_data
        在android.content.ContentResolver.insert(ContentResolver.java:1203)
        在com.purewowstudio.topmovies.data.DatabaseHelper.addFilm(DatabaseHelper.java:52)
        在com.purewowstudio.topmovies.fragments.FilmList $ getFilms.onPostExecute(FilmList.java:72)
        在com.purewowstudio.topmovies.fragments.FilmList $ getFilms.onPostExecute(FilmList.java:62)
        在android.os.AsyncTask.finish(AsyncTask.java:632)
        在android.os.AsyncTask.access $ 600(AsyncTask.java:177)
        在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:645)
        在android.os.Handler.dispatchMessage(Handler.java:102)
        在android.os.Looper.loop(Looper.java:135)
        在android.app.ActivityThread.main(ActivityThread.java:5262)
        在java.lang.reflect.Method.invoke(本机方法)
        在java.lang.reflect.Method.invoke(Method.java:372)
        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:898)
        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
 

内容提供商

 公共类FilmProvider扩展ContentProvider的{

公共静态最后弦乐TABLE_NAME =film_data;
公共静态最后弦乐管理局=com.purewowstudio.topmovies.data.FilmProvider;
公共静态最终乌里CONTENT_URI = Uri.parse(内容://+ AUTHORITY +/+ TABLE_NAME);

公共静态最终诠释膜= 1;
公共静态最终诠释FILMS_ID = 2;

公共静态最终UriMatcher sURIMatcher =
        新UriMatcher(UriMatcher.NO_MATCH);

静态{
    sURIMatcher.addURI(权威,TABLE_NAME,电影);
    sURIMatcher.addURI(权威,TABLE_NAME +/#,
            FILMS_ID);
}

私人DatabaseHelper MDB;

公共布尔的onCreate(){
    MDB =新DatabaseHelper(的getContext(),NULL,NULL,1);
    返回false;
}

@覆盖
公共字符串的getType(URI URI){
    返回null;
}

@覆盖
公共光标查询(URI URI,字符串[]投影,选择字符串,字符串[] selectionArgs两个,串排序顺序){

    SQLiteQueryBuilder QueryBuilder的=新SQLiteQueryBuilder();
    queryBuilder.setTables(MovieDataContract.TABLE_NAME);
    INT uriType = sURIMatcher.match(URI);

    开关(uriType){
        案例FILMS_ID:
            queryBuilder.appendWhere(MovieDataContract.FilmEntry._ID +=
                    + uri.getLastPathSegment());
            打破;
        案例片:
            打破;
        默认:
            抛出新抛出:IllegalArgumentException(未知URI);
    }

    光标光标= queryBuilder.query(mDB.getReadableDatabase()
            投影,选择,selectionArgs两个,空,空,
            排序);
    cursor.setNotificationUri(的getContext()。getContentResolver(),
            URI);
    返回游标;

}

@覆盖
公众开放的插入(URI URI,ContentValues​​值){

    INT uriType = sURIMatcher.match(URI);

    SQLiteDatabase SQLDB = mDB.getWritableDatabase();

    长ID = 0;
    开关(uriType){
        案例片:
            ID = sqlDB.insert(MovieDataContract.TABLE_NAME,
                    空,价值观);
            打破;
        默认:
            抛出新抛出:IllegalArgumentException(未知URI
                    + URI);
    }
    的getContext()getContentResolver()有NotifyChange(URI,空)。
    返回Uri.parse(MovieDataContract.TABLE_NAME +/+ ID);
}
 

DatabaseHelper类

 公共类DatabaseHelper扩展SQLiteOpenHelper {

私人ContentResolver的myCR;

公共DatabaseHelper(上下文的背景下,字符串名称,
                      SQLiteDatabase.CursorFactory工厂,INT版){
    超(背景下,MovieDataContract.DATABASE_NAME,工厂,MovieDataContract.DATABASE_VERSION);

    myCR = context.getContentResolver();
}

@覆盖
公共无效的onCreate(SQLiteDatabase DB){
    db.execSQL(MovieDataContract.FilmEntry.SQL_CREATE_TABLE);
}

@覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
    db.execSQL(MovieDataContract.FilmEntry.DELETE_TABLE);
    的onCreate(DB);
}

公共无效addFilm(电影胶片){

    SQLiteDatabase DB = this.getWritableDatabase();

    ContentValues​​值=新ContentValues​​();
    values​​.put(MovieDataContract.FilmEntry.COLUMN_FILM_TITLE,film.getTitle());
    values​​.put(MovieDataContract.FilmEntry.COLUMN_FILM_RATING,film.getRating());
    values​​.put(MovieDataContract.FilmEntry.COLUMN_FILM_RUNTIME,film.getRuntime());
    values​​.put(MovieDataContract.FilmEntry.COLUMN_FILM_CRITICS,film.getCritics());
    values​​.put(MovieDataContract.FilmEntry.COLUMN_FILM_AUDIENCE,film.getAudience());
    values​​.put(MovieDataContract.FilmEntry.COLUMN_FILM_SYNOPSIS,film.getSynopsis());
    values​​.put(MovieDataContract.FilmEntry.COLUMN_FILM_PROFILE,film.getProfile());

    myCR.insert(FilmProvider.CONTENT_URI,价值观);

    db.insert(MovieDataContract.TABLE_NAME,
            空值,
            值);
    db.close();
}
 

清单

 < XML版本=1.0编码=UTF-8&GT?;
 

 <使用-权限的Andr​​oid:名称=android.permission.INTERNET对/>

<应用
    机器人:allowBackup =真
    机器人:图标=@纹理映射/ ic_launcher
    机器人:标签=@字符串/ APP_NAME
    机器人:主题=@风格/ TopMoviesTheme>
    <活动
        机器人:名称=。MainActivity
        机器人:标签=@字符串/ APP_NAME>
        <意向滤光器>
            <作用机器人:名称=android.intent.action.MAIN/>
            <类机器人:名称=android.intent.category.LAUNCHER/>
        &所述; /意图滤光器>
    < /活性GT;
    <活动
        机器人:名称=。DetailFragment
        机器人:标签=@字符串/ title_activity_detail_fragment
        机器人:parentActivityName =MainActivity。>
        &所述;元数据
            机器人:名称=android.support.PARENT_ACTIVITY
            机器人:值=com.purewowstudio.topmovies.MainActivity/>
        <供应商
            机器人:名称=。data.filmProvider
            机器人:当局=com.purewowstudio.topmovies.data.filmProvider
            机器人:出口=真正的>
        < /供应商>
    < /活性GT;
< /用途>

< /舱单>
 

解决方案

首先,移动<供应商> 成为℃的子女;用途> ,不是<活性GT;

二,变更安卓出口=真正的安卓出口=假,直至时间,因为你保护你的的ContentProvider 。既然这样,一旦你确定了<供应商> 如上所述元素位置,任何应用程序都可以读取和您的供应商,这是不可能写什么是什么用户想要的。

IllegalArgumentException: Unknown URL content://

^ Having a nightmare with the above. I've checked my variables and paths but can't see what the issue is? Greatly appreciate any pointers!

Here's my trace.

 java.lang.IllegalArgumentException: Unknown URL     
 content://com.purewowstudio.topmovies.data.FilmProvider/film_data
        at android.content.ContentResolver.insert(ContentResolver.java:1203)
        at com.purewowstudio.topmovies.data.DatabaseHelper.addFilm(DatabaseHelper.java:52)
        at com.purewowstudio.topmovies.fragments.FilmList$getFilms.onPostExecute(FilmList.java:72)
        at com.purewowstudio.topmovies.fragments.FilmList$getFilms.onPostExecute(FilmList.java:62)
        at android.os.AsyncTask.finish(AsyncTask.java:632)
        at android.os.AsyncTask.access$600(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5262)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

Content Provider

public class FilmProvider extends ContentProvider {

public static final String TABLE_NAME = "film_data";
public static final String AUTHORITY =  "com.purewowstudio.topmovies.data.FilmProvider";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME);

public static final int FILMS = 1;
public static final int FILMS_ID = 2;

public static final UriMatcher sURIMatcher =
        new UriMatcher(UriMatcher.NO_MATCH);

static {
    sURIMatcher.addURI(AUTHORITY, TABLE_NAME, FILMS);
    sURIMatcher.addURI(AUTHORITY, TABLE_NAME + "/#",
            FILMS_ID);
}

private DatabaseHelper mDB;

public boolean onCreate() {
    mDB = new DatabaseHelper(getContext(), null, null, 1);
    return false;
}

@Override
public String getType(Uri uri) {
    return null;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[]        selectionArgs, String sortOrder) {

    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(MovieDataContract.TABLE_NAME);
    int uriType = sURIMatcher.match(uri);

    switch (uriType) {
        case FILMS_ID:
            queryBuilder.appendWhere(MovieDataContract.FilmEntry._ID + "="
                    + uri.getLastPathSegment());
            break;
        case FILMS:
            break;
        default:
            throw new IllegalArgumentException("Unknown URI");
    }

    Cursor cursor = queryBuilder.query(mDB.getReadableDatabase(),
            projection, selection, selectionArgs, null, null,
            sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(),
            uri);
    return cursor;

}

@Override
public Uri insert(Uri uri, ContentValues values) {

    int uriType = sURIMatcher.match(uri);

    SQLiteDatabase sqlDB = mDB.getWritableDatabase();

    long id = 0;
    switch (uriType) {
        case FILMS:
            id = sqlDB.insert(MovieDataContract.TABLE_NAME,
                    null, values);
            break;
        default:
            throw new IllegalArgumentException("Unknown URI: "
                    + uri);
    }
    getContext().getContentResolver().notifyChange(uri, null);
    return Uri.parse(MovieDataContract.TABLE_NAME + "/" + id);
}

DatabaseHelper Class

 public class DatabaseHelper extends SQLiteOpenHelper {

private ContentResolver myCR;

public DatabaseHelper(Context context, String name,
                      SQLiteDatabase.CursorFactory factory, int version) {
    super(context, MovieDataContract.DATABASE_NAME, factory, MovieDataContract.DATABASE_VERSION);

    myCR = context.getContentResolver();
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(MovieDataContract.FilmEntry.SQL_CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(MovieDataContract.FilmEntry.DELETE_TABLE);
    onCreate(db);
}

public void addFilm(Film film){

    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_TITLE, film.getTitle());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_RATING,  film.getRating());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_RUNTIME,  film.getRuntime());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_CRITICS,  film.getCritics());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_AUDIENCE,  film.getAudience());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_SYNOPSIS,  film.getSynopsis());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_PROFILE,  film.getProfile());

    myCR.insert(FilmProvider.CONTENT_URI, values);

    db.insert(MovieDataContract.TABLE_NAME,
            null,
            values);
    db.close();
}

Manifest

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/TopMoviesTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".DetailFragment"
        android:label="@string/title_activity_detail_fragment"
        android:parentActivityName=".MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.purewowstudio.topmovies.MainActivity" />
        <provider
            android:name=".data.filmProvider"
            android:authorities="com.purewowstudio.topmovies.data.filmProvider"
            android:exported="true">
        </provider>
    </activity>
</application>

</manifest>

解决方案

First, move <provider> to be a child of <application>, not <activity>.

Second, change android:exported="true" to android:exported="false", until such time as you secure your ContentProvider. As it stands, once you fix the <provider> element location as noted above, any app can read and write anything in your provider, which is unlikely to be what the user wants.

这篇关于抛出:IllegalArgumentException:未知的URL内容://内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆