そこで、ユーザーが自分の携帯電話でバスの切符を購入し、取引が終了したらすぐにPDFファイルをダウンロードできるようにするプログラムを作成しました。これは、URLが変更され、キーワードTicsnetReceipt.aspxが含まれているかどうかを確認することで実行され、トランザクションが完了したことを通知します。将来使用するために、URLから名前やメールアドレスなどの他の情報も保存するので、これは問題なく機能します。
次に、Soapを使用してファイルをダウンロードします。
public String getPDFxml(String ReferenceID){
String NAMESPACE = "http://tempuri.org/";
String METHOD_NAME = "GetPDFxml";
String SOAP_ACTION = "http://tempuri.org/GetPDFxml";
String URL = "http://77.40.188.73:28082/SasMobileWS/SasMobile.asmx?op=GetPDFxml";
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo pi = new PropertyInfo();
pi.setName("Reference");
pi.setValue(ReferenceID);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
String strRes = result.toString();
String temp[];
temp = strRes.split("TravelDate");
String Date[] = temp[1].split(">|<|/");
String theDate = Date[1];
return(theDate);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
return null;
}
public void getPDFbytes(String TransactionID, String Date){
String NAMESPACE = "http://tempuri.org/";
String METHOD_NAME = "GetPDFbytes";
String SOAP_ACTION = "http://tempuri.org/GetPDFbytes";
String URL = "http://77.40.188.73:28082/SasMobileWS/SasMobile.asmx?op=GetPDFbytes";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo pi = new PropertyInfo();
pi.setName("Reference");
pi.setValue(TransactionID);
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
try {
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
} catch (Exception e) {
e.printStackTrace();
}
SoapObject resultsRequestSOAP = null;
try{
resultsRequestSOAP = (SoapObject) envelope.getResponse();
}catch (Exception e) {
try{
resultsRequestSOAP = (SoapObject) envelope.bodyIn;
}catch(Exception f){
f.printStackTrace();
}
}
byte[] result = null;
try {
result = Base64.decode(resultsRequestSOAP.getProperty("GetPDFbytesResult").toString());
} catch(Exception e){
e.printStackTrace();
}
try {
Date = Date.replace(".", "");
FileOutputStream fos = openFileOutput(Date + "_" + TransactionID + ".pdf", Context.MODE_WORLD_READABLE);
fos.write(result);
fos.close();
} catch(FileNotFoundException ex){
ex.printStackTrace();
} catch(IOException ioe){
ioe.printStackTrace();
}
}
これはすべて、私が試した他のモデルでは正常に機能しますが、S3ではファイルがダウンロードされず、ビューアーでファイルを開こうとしたときにファイルが存在しないことをユーザーに通知します。
私は99%確信していますが、石鹸に何か問題があり、私には理解できません。しかし、これがうまく見える場合、私は何が起こっているのか分かりません:p
前もって感謝します :)
もう少しテストを行った後、問題の原因は次のとおりです。
androidHttpTransport.call(SOAP_ACTION, envelope);
これはデータをまったく読み取っていないように見えますが、これは上記の方法と同じ入力であると想定されているため、奇妙です。どちらのメソッドも文字列参照(実際には数値)を受け入れます。最初のメソッドでは、GetPDFxmlが文字列を返し、GetPDFbytesがbase64Binaryを返します。
プログラムがクラッシュする直前に、envolopeから値を取得すると、次のように表示されます。
envelope
SoapSerializationEnvelope (id=830066090736)
addAdornments true
avoidExceptionForUnknownProperty false
bodyIn SoapFault (id=830066150416)
bodyOut SoapObject (id=830066090472)
classToQName Hashtable (id=830066090944)
dotNet true
enc "http://schemas.xmlsoap.org/soap/encoding/" (id=830065748280)
encodingStyle null
env "http://schemas.xmlsoap.org/soap/envelope/" (id=830065748552)
headerIn null
headerOut null
idMap Hashtable (id=830066090864)
implicitTypes false
multiRef Vector (id=830066102400)
properties Hashtable (id=830066090824)
qNameToClass Hashtable (id=830066090904)
version 110
xsd "http://www.w3.org/2001/XMLSchema" (id=830065748824)
xsi "http://www.w3.org/2001/XMLSchema-instance" (id=830065749064)
そして、どちらもenvelope.getResponse(); またはresultsRequestSOAP=(SoapObject)envelope.bodyIn; 有効な値を返します。