目前我正在开发一个 android 应用程序,我正在使用从互联网获取的 xml 提要。问题是当我的手机没有互联网连接时,我的应用程序崩溃了。我想获取我的 xml 文件并将其放入资产中。
我的问题是:有可能吗?如果是的话,最好的解决方案是什么?
在运行时编写 xml 文件或文件assets
夹中的任何文件是不可能的。文件夹中的文件夹或资源res
是“只读的”,但您可以在应用程序的内部数据文件夹中写入 XML 文件。
只需使用Context.openFileInput(String)
and Context.openFileOutput(String, int)
。这里
更新 1:
你可能会想到这个问题。
"If I write an XML file on my app's data folder, how to parse it?"
您可以使用XMLPullParser
类来解析 XML 文件。这是一个例子
XMLPullParser parser = Xml.newPullParser();
parser.setInput(new InputStreamReader(openFileInput("my_XML_file.xml")));
检查网络连接:
public static boolean isConnectedToInternet(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null)
{
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
return false;
}
下载 XML 字符串
public String getXMLString(String url) {
try
{
URL url1 = new URL(url);
URLConnection tc = url1.openConnection();
tc.setConnectTimeout(timeout);
tc.setReadTimeout(timeout);
BufferedReader br = new BufferedReader((new InputStreamReader(tc.getInputStream())));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null)
{
sb.append(line + "\n");
}
br.close();
return sb.toString();
} catch (Exception e)
{
Log.d("Error", "In XMLdownloading");
}
return null;
}
将字符串保存到 SD 卡中的任意目录:
private void writeStringToTextFile(String s, String f) {
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath());
dir.mkdirs();
File file = new File(dir, f);
try
{
FileOutputStream f1 = new FileOutputStream(file, false);
PrintStream p = new PrintStream(f1);
p.print(s);
p.close();
f1.close();
} catch (FileNotFoundException e)
{
} catch (IOException e)
{
}
}
}
将此方法添加到您的活动中:
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager
.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
并在 onCreate 或在您加载提要检查之前,如下所示:
if (!isNetworkAvailable()) {
Toast.makeText(
Player.this,
"No active internet connection found.",
Toast.LENGTH_LONG).show();
finish();
return;
}