我在Android TV(sampleApp)中遇到此问题。
我正在从xml文件输入流媒体频道。我正在创建一个在开始时使用的临时文件,然后我创建了一个按钮,它执行所有必要的功能,从服务器获取数据并从该数据创建新的xml文件。所有这些都有效,但有一个问题:
按下按钮并创建文件后,我尝试按“添加频道”按钮添加频道,但使用的文件是临时文件,而不是新的xml文件。因此,它使用NEW xml文件,我必须重新运行安装程序,然后它会发挥作用。它似乎将临时文件缓存在内存或其他东西中,并在添加频道时首先使用它,因为当启动应用程序时,没有内部存储文件(这是我保存新的xml文件的地方),该文件仅在之后创建按下按钮。
如何制作它以便它使用新的xml文件而不是临时文件(在应用程序启动期间创建)?而不是重新设置
答案 0 :(得分:0)
这是使用的方法。基本上,在第一次启动时,它会创建一个没有通道或程序的xml(临时文件)并执行它所拥有的功能。然后使用我的其他类我创建一个包含所有通道和程序的新xml文件。这也有效,文件存在,按“添加频道”按钮后,它会转到else语句。但无论如何,在按下按钮后第一次尝试时,它总是添加临时文件,而不是新文件。如果我再次启动设置,则只会运行新的。
public static XmlTvParser.TvListing getRichTvListings(Context context) {
context1 = context;
FileOutputStream fos;
try {
Boolean exists = context.getFileStreamPath(FILENAME).exists();
if (exists == false){
String string = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<!DOCTYPE tv SYSTEM \"xmltv.dtd\">\n" +
"\n" +
"<tv>\n" +
"</tv>";
Log.d(TAG,"Exists: FALSE");
fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
read = "file:" + context.getFilesDir().toString() + "/" + FILENAME ;
Uri catalogUri =Uri.parse(read);
if (sSampleTvListing != null) {
return sSampleTvListing;
}
try (InputStream inputStream = getInputStream(context, catalogUri)) {
sSampleTvListing = XmlTvParser.parse(inputStream);
} catch (IOException e) {
Log.e(TAG, "Error in fetching " + catalogUri, e);
}
}
else{
Log.d(TAG,"Exists: TRUE");
FileInputStream fis = context.openFileInput(FILENAME2);
StringBuilder builder = new StringBuilder();
int inputChar;
while((inputChar = fis.read()) != -1) {
builder.append((char) inputChar);
}
String readFile = builder.toString();
Log.d(TAG, "FileContent: " + readFile);
read = "file:" + context.getFilesDir().toString() + "/" + FILENAME2 ;
Uri catalogUri =Uri.parse(read);
if (sSampleTvListing != null) {
return sSampleTvListing;
}
try (InputStream inputStream = getInputStream(context, catalogUri)) {
sSampleTvListing = XmlTvParser.parse(inputStream);
} catch (IOException e) {
Log.e(TAG, "Error in fetching " + catalogUri, e);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sSampleTvListing;
}
按钮功能在我的richSetupFragment类中(我不会发布所有内容,但这些是我认为在这种情况下最重要的部分):
@Override
protected Boolean doInBackground(Uri... params) {
mTvListing = RichFeedUtil.getRichTvListings(getActivity());
mPoster = fetchPoster();
return true;
}
@Override
public void onActionClicked(Action action) {
if (action.getId() == ACTION_ADD_CHANNELS) {
setupChannels(mInputId);
} else if (action.getId() == ACTION_CANCEL) {
getActivity().finish();
}
else if (action.getId() == RETRIEVE_DATA) {
getChannelsFromServer();
// Log.d(TAG,"List: " + list);
}
private void setupChannels(String inputId) {
inputIdLocal= inputId;
if (mTvListing == null) {
onError(R.string.feed_error_message);
return;
}
TvContractUtils.updateChannels(getActivity(), inputId, mTvListing.channels);
SyncUtils.setUpPeriodicSync(getActivity(), inputId);
SyncUtils.requestSync(inputId, true);
mSyncRequested = true;
// Watch for sync state changes
if (mSyncObserverHandle == null) {
final int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING |
ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE;
mSyncObserverHandle = ContentResolver.addStatusChangeListener(mask,
mSyncStatusObserver);
}
}