2017-10-30 37 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) 

주, 그래서 나는 생각한다 사용 권한이 매니페스트 파일에 올바르게 설정되어 있어야합니다.

다음 샘플 코드는 프로그램 제목으로 쿼리하려고하지만 위의 예외가 throw됩니다.

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로만 쿼리를 허용하는 이유 중 하나입니다. 쿼리에 프로젝션을 설정하여 결과에 모든 메타 데이터가 다시 나타나지 않도록 할 수 있습니다. 제목이 열쇠 인 특별한 용도는 무엇입니까? 나는 더 잘 이해하기에 호기심이 많다. – Benjamin