问题描述
我试图通过JobService异步操作删除TV.db中我的应用插入的某些频道。
每次删除时都会出现安全异常。
Process: com.app,PID: 7026
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:304)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.SecurityException: Selection not allowed for content://android.media.tv/channel?input=<My package>%2F.live.TvInputService&browsable_only=false
at android.os.Parcel.readException(Parcel.java:1574)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
at android.content.ContentProviderProxy.delete(ContentProviderNative.java:544)
at android.content.ContentResolver.delete(ContentResolver.java:1299)
at com.TvContractUtills.updateChannelsWithGraceNote(TvContractUtills.java:173)
at com.EpgUpdateTask.doInBackground(EpgUpdateTask.java:48)
at com.EpgUpdateTask.doInBackground(EpgUpdateTask.java:11)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
resolver.delete(channelsUri,TvContract.Channels._ID+ " in ("+getlistofIds(availableChannelMap) +" )",null);
availableChannelMap返回以逗号分隔的频道ID列表。
当我将where子句保留为null时,相同的代码也起作用。
resolver.delete(channelsUri,null,null);
知道为什么会这样。
解决方法
要删除频道,您需要像这样调用ContentResolver
context.contentResolver.delete(TvContractCompat.buildChannelUri(channelId),null,null)
如果要删除多个频道,请将其循环播放。我不确定这是否正确。我没有在providers
API中看到任何批量删除方法。虽然可以。