私はこの独特の質問で頭がいっぱいです。URLからAndroidフォン(Desire HD v2.3.3)にxmlファイルをダウンロード(またはコピーを作成)しようとしています。SOF の多くの人々によると、そのままで動作するはずですが、どのように試し、どのチュートリアルに従っても、動作しません。私の知る限り、目的のxmlファイルを取得できません。
logcat には何も表示されず、コードに文字列メッセージが表示されます。
以下は私のコードです:
private void programXmlExists() {
//Kontrollerar om XML-filern Program.xml existerar annars skall den laddas ner.
//Om filen existerar, så skall filens timestamp jämföras med dagens. Är det större skillnad än kl. 00.00
//så skall en ny uppdatering ske.
if(xmlFileExistence("Program.xml")){
Toast.makeText(this, "1) Program.xml exists ", Toast.LENGTH_SHORT).show();
System.out.println("1) File exists");
//Filen Program.xml existerar. Kolla om filens timestamp är yngre än 00.00 Om så ej är fallet, så skall en uppdaterad version
//hämtas från servern
File file = getBaseContext().getFileStreamPath("Program.xml");
file = new File(this.getFilesDir().getAbsolutePath() + "Program.xml");
long date = file.lastModified();
//Toast.makeText(this, "Date: "+date, Toast.LENGTH_SHORT).show();
//Glöm ej att radera den gamla Program.xml om den behöver uppdateras
//deleteFile("Program.xml");
//downloaderThread = new Thread(this, "http://ken.nu/projekt/Program.xml");
//downloaderThread.start();
/**
* Connects to the URL of the file, begins the download, and notifies the
* AndroidFileDownloader activity of changes in state. Writes the file to
* the root of the SD card.
*/
URL url = null;
URLConnection conn = null;
int fileSize, lastSlash;
String fileName;
BufferedInputStream inStream = null;;
BufferedOutputStream outStream = null;;
File outFile;
FileOutputStream fileStream = null;
Message msg;
// We're going to connect now
try {
url = new URL("http://ken.nu/projekt/Program.xml");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn = url.openConnection();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn.setUseCaches(false);
fileSize = conn.getContentLength();
// get the filename
lastSlash = url.toString().lastIndexOf('/');
fileName = "Program.xml";
if(lastSlash >=0)
{
fileName = url.toString().substring(lastSlash + 1);
}
if(fileName.equals(""))
{
fileName = "Program.xml";
}
// start download
try {
inStream = new BufferedInputStream(conn.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outFile = new File(Environment.getExternalStorageDirectory() + "/" + fileName);
try {
fileStream = new FileOutputStream(outFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outStream = new BufferedOutputStream(fileStream, DOWNLOAD_BUFFER_SIZE);
byte[] data = new byte[DOWNLOAD_BUFFER_SIZE];
int bytesRead = 0, totalRead = 0;
try {
while((bytesRead = inStream.read(data, 0, data.length)) >= 0)
{
outStream.write(data, 0, bytesRead);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
outStream.close();
fileStream.close();
inStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
xmlFileExistence("Program.xml");
}else{
//Programs.xml finns inte. Ladda ner en ny version utav den från servern
Toast.makeText(this, "Program.xml DOESNT exist ", Toast.LENGTH_SHORT).show();
System.out.println("2) Does not exist");
File dir = getFilesDir();
//Filen existerar inte. Hämta en ny version från servern
String FILENAME = "Program.xml";
// File url to download
String file_url = "http://ken.nu/projekt/Program.xml";
//------------
/**
* Connects to the URL of the file, begins the download, and notifies the
* AndroidFileDownloader activity of changes in state. Writes the file to
* the root of the SD card.
*/
URL url = null;
URLConnection conn = null;
int fileSize, lastSlash;
String fileName;
BufferedInputStream inStream = null;;
BufferedOutputStream outStream = null;;
File outFile;
FileOutputStream fileStream = null;
Message msg;
// We're going to connect now
try {
url = new URL("http://ken.nu/projekt/Program.xml");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn = url.openConnection();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn.setUseCaches(false);
fileSize = conn.getContentLength();
// get the filename
lastSlash = url.toString().lastIndexOf('/');
fileName = "Program.xml";
if(lastSlash >=0)
{
fileName = url.toString().substring(lastSlash + 1);
}
if(fileName.equals(""))
{
fileName = "Program.xml";
}
// start download
try {
inStream = new BufferedInputStream(conn.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outFile = new File(Environment.getExternalStorageDirectory() + "/" + fileName);
try {
fileStream = new FileOutputStream(outFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outStream = new BufferedOutputStream(fileStream, DOWNLOAD_BUFFER_SIZE);
byte[] data = new byte[DOWNLOAD_BUFFER_SIZE];
int bytesRead = 0, totalRead = 0;
try {
while((bytesRead = inStream.read(data, 0, data.length)) >= 0)
{
outStream.write(data, 0, bytesRead);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
outStream.close();
fileStream.close();
inStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
xmlFileExistence("Program.xml");
//------------
}
//deleteFile("Program.xml");
System.out.println("3) End");
}
これが私のloadSpinnerPrograms()です。
private void loadSpinnerPrograms() {
List<String> SpinnerProgramsArray = new ArrayList<String>();
spinnerPrograms = (Spinner) findViewById(R.id.spinner_programs);
//Code input to spinner
Document doc = null;
/*
try {
doc = Jsoup.connect("http://ken.nu/projekt/Program.xml").get();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}*/
doc = Jsoup.parse("Program.xml", "utf-8");
System.out.println("loadSpinnerPrograms: "+doc.toString());
Elements id = doc.getElementsByTag("id"); //Hämta alla element som finns med tagen id
Elements namn = doc.getElementsByTag("namn"); //Hämta alla element som finns med tagen namn
int i = 0;
//Denna forsats används för att få ut elementen id och namn som finns i elementen kurs
//och lägga till dem i SpinnersArray
for (Element e : doc.select("kurs")){
System.out.println("id: "+id.get(i).text()+" namn: "+namn.get(i).text());
SpinnerProgramsArray.add(id.get(i).text()+" - "+namn.get(i).text());
i++;
}
System.out.println("Programs counter: "+i);
ArrayAdapter<String> adapterProg = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, SpinnerProgramsArray);
adapterProg.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerPrograms.setAdapter(adapterProg);
spinnerPrograms.setOnItemSelectedListener(this);
/*
* Denna kod användes för testning när man laddade in items från en xml-.fil
spinnerPrograms = (Spinner) findViewById(R.id.spinner_programs);
ArrayAdapter<CharSequence> adapterProg = ArrayAdapter.createFromResource( this, R.array.programs_array, android.R.layout.simple_spinner_item);
adapterProg.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerPrograms.setAdapter(adapterProg);
spinnerPrograms.setOnItemSelectedListener(this);
*/
}
本当に驚いたのは、出力ファイル内の要素を読み取ろうとすると、出力ファイルがこれを提供することです。ファイルを読み取ろうとすると、html タグが表示され、本文に Programs.xml と表示されます。オンラインの xml ファイルをファイルに含める必要があります。どなたか、私がどこで間違っているかを理解するのを手伝ってもらえますか? 私は本当にこれで終わりです。
よろしく、SM