2017-10-30 30 views
0

返します:私はプログラムの追加と削除を行うことができクエリは、セキュリティ例外

java.lang.SecurityException: Selection not allowed for content://android.media.tv/program 
    at android.os.Parcel.readException(Parcel.java:1683) 
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183) 
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) 
    at android.content.ContentProviderProxy.query(ContentProviderNative.java:421) 
    at android.content.ContentResolver.query(ContentResolver.java:530) 
    at android.content.ContentResolver.query(ContentResolver.java:472) 

注意をので、私は考えますマニフェストファイルに権限が正しく設定されています。

次のサンプルコードはプログラムタイトルでクエリを実行しようとしていますが、上記の例外がスローされます。

Uri uri = TvContract.Programs.CONTENT_URI; 

Cursor cursor = null; 
try { 
    String mSelectionClause = TvContract.Programs.COLUMN_TITLE + " = ?"; 
    String[] mSelectionArgs = { "Test title" }; 
    cursor = resolver.query(uri, Program.PROJECTION, mSelectionClause, mSelectionArgs, null); 
    if (cursor == null || cursor.getCount() == 0) { 
     Log.d(TAG, "No programs found for 'Test title'"); 
     return programs; 
    } 
    Log.d(TAG, cursor.getCount() + " programs found for 'Test tilte'"); 
} catch (Exception e) { 
    Log.w(TAG, "Unable to get programs for 'Test title'", e); 
} finally { 
    if (cursor != null) { 
     cursor.close(); 
    } 
} 

どの列でも照会できませんか?

答えて

0

TvProviderは選択できません。追加/更新/削除はできますが、カスタムクエリを作成することはできません。 TvContractCompatを使用してクエリURIを構築し、結果を評価する必要があります。

context.getContentResolver() 
    .query(TvContractCompat.buildChannelUri(channelId), null, null, null, null); 

やプログラム

context.getContentResolver() 
    .query(TvContractCompat.buildProgramsUriForChannel(channelId), null, null, null, null); 

とご例えば、特定のプログラム

context.getContentResolver() 
    .query(TvContractCompat.buildProgramUri(programId), null, null, null, null); 

のためにあなたがあなたのチャンネルで番組を問い合わせる必要がありますし、タイトルを検索するため。

try (Cursor cursor = context.getContentResolver() 
         .query(
       TvContractCompat.buildProgramsUriForChannel(channelId), 
       null, null, null, null)) { 
    if (cursor != null && cursor.moveToNext()) { 
     Program program = Program.fromCursor(cursor); 
     if("Test Title".equals(program.getTitle()) { 
      // Do stuff... 
     } 
    } 
} 

参考: https://developer.android.com/training/tv/discovery/recommendations-channel.html#best_practices

+0

私はそれはあなたが提供されたリンクで記事は「WHERE句が許可されていない」と述べていることがわかります。それはなぜですか?非常に制限的です。特定のプログラムにアクセスするたびに、すべてのチャンネルのプログラムを終了する必要がありますが、非常に遅いです! – vas

+0

@vas複数のアプリがTvプロバイダにチャンネルを持つことができるため、プロバイダは各アプリを独自のデータサンドボックスに制限しようとします。 特定のプログラムを照会する場合は、タイトルではなく識別子で照会するのが理想的です。タイトルは異なる言語に翻訳され、偉大なキーを作成することはできません。これは、TvプロバイダがIDだけでクエリを許可する理由の1つです。 結果にすべてのメタデータが戻らないように、クエリに投影を設定できます。 タイトルがキーである特定のユースケースは何ですか?私はより理解して好奇心が強いです。 – Benjamin

関連する問題