2017-10-30 6 views
0

Wenn ich versuche, durch irgendetwas die Programme Datenbank abzufragen andere als Kanal oder Programm-ID ich die folgende Ausnahme erhalten:Abfrage für Programme Gibt Sicherheitsausnahme

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) 

Bitte beachte, dass ich hinzufügen und Programme löschen, so dass ich denke, Berechtigungen sind in der Manifestdatei korrekt festgelegt.

Der folgende Beispielcode versucht, nach Programmtitel abzufragen, aber die obige Ausnahme wird ausgelöst.

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(); 
    } 
} 

Ist es nicht möglich, nach einer Spalte abzufragen?

Antwort

0

Der TvProvider ist nicht für die Auswahl geöffnet. Sie können hinzufügen/aktualisieren/löschen, aber Sie können keine benutzerdefinierten Abfragen erstellen. Sie müssen TvContractCompat verwenden, um Ihre Abfrage-URIs zu erstellen und die Ergebnisse auszuwerten.

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

oder für Programme

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

und für ein bestimmtes Programm

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

Für Ihr Beispiel, das Sie für die Programme in Ihren Kanälen für den Titel und die Suche abfragen soll.

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... 
     } 
    } 
} 

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

+0

Ich sehe, dass der Artikel in dem Link zur Verfügung gestellt wird erwähnt, dass "WHERE-Klauseln sind nicht erlaubt". Warum ist das so? Es ist sehr restriktiv. Die Programme jedes Kanals jedes Mal durchlaufen zu müssen, wenn Sie auf ein bestimmtes Programm zugreifen möchten, ist sehr langsam! – vas

+0

@vas Da mehrere Apps Kanäle im Tv-Provider haben können, versucht der Anbieter, jede App auf die eigene Sandbox von Daten zu beschränken. Im Idealfall, wenn Sie ein bestimmtes Programm abfragen möchten, sollten Sie nach einem Bezeichner und nicht nach einem Titel suchen. Titel können in verschiedene Sprachen übersetzt werden und bilden keine großartigen Schlüssel. Dies ist ein Grund, warum der Tv-Provider nur Abfragen nach ID erlaubt. Sie können eine Projektion für Ihre Abfrage festlegen, damit nicht alle Metadaten in den Ergebnissen angezeigt werden. Was ist Ihr besonderer Anwendungsfall, in dem der Titel der Schlüssel ist? Ich bin neugierig, es besser zu verstehen. – Benjamin

Verwandte Themen