誰かがこれを理解するのを手伝ってくれますか? Androidでksoapを使用して、base64文字列形式の画像を.Net Webサービス(Webサーバー)にアップロードしようとしています。Android アプリの送信ボタンをクリックすると、ファイルを正常にアップロードできましたが、フリーズして応答しなくなりました。どこでも解決策を確認しましたが、何も見つかりませんでした。PHPサーバーへのPostメソッドを使用するほとんどのソリューション。助けてください!前もって感謝します。
これが私のコードです。
btnSubmit.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
//save image to path///////////////////
try{
String ImageData = lblEncodedImage.getText().toString();
imagefile = lblTargetUri.getText().toString();
//webservice class for android.
WebServiceCaller DWSCaller = new WebServiceCaller();
int uploadResult = DWSCaller.UploadFile(ImageData, imagefile);
if(uploadResult == 1){
//do something
lblStatus.setText("Submitted!");
}
else
{
lblStatus.setText("Error Submitting");
}
}
catch(Exception e) {
e.printStackTrace();
lblStatus.setText("Error Submitting" + e.getMessage());
}
////////////////////////////////////////
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
try {
Uri targetUri = data.getData();
//txtTargetUri.setText(targetUri.toString());
String fileName = getRealPathFromURI(targetUri);
File aFile = new File(fileName);
///////////////////////
lblTargetUri.setText(aFile.getName());
lblImagePath.setText(fileName);
Bitmap bitmap;
//bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
//Or use decodefile method
bitmap = BitmapFactory.decodeFile(fileName);
targetImage.setImageBitmap(bitmap);
//base 64 conversion
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] byteArray = baos.toByteArray();
//Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
//targetImage.setImageBitmap(bm);
encodedImage = Base64.encodeToString(byteArray, Base64.DEFAULT);
lblEncodedImage.setText(encodedImage);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
また、WebServiceCaller という別のクラスも作成しました。コードは次のとおりです。
public class WebServiceCaller {
private final String NAMESPACE = "http://tempuri.org/";
private final String URL = "http://10.0.2.2:63097/service.asmx?WSDL";
public int UploadFile(String imageData, String filename){
int result = 0;
final String SOAP_ACTION = "http://tempuri.org/CreateFileFromBase64String";
final String METHOD_NAME = "CreateFileFromBase64String";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo propInfo1 =new PropertyInfo();
propInfo1.setName("_imageData");
propInfo1.setValue(imageData);
propInfo1.setType(String.class);
request.addProperty(propInfo1);
PropertyInfo propInfo2 =new PropertyInfo();
propInfo2.setName("_filename");
propInfo2.setValue(filename);
propInfo2.setType(String.class);
request.addProperty(propInfo2);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true; // put this only if the web service is .NET one
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
Log.i("myApp", response.toString());
if(response.toString().equalsIgnoreCase("true")){
result = 1;
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
これが私の.Net WebサービスのWebメソッドです
[WebMethod]
public bool CreateFileFromBase64String(string _imageData, string _filename)
{
try
{
string path = @"C:\inetpub\wwwroot\web\";
MemoryStream msf = new MemoryStream(Convert.FromBase64String(_imageData));
Stream stem = new FileStream(path + _filename, FileMode.Create);
msf.WriteTo(stem);
msf.Flush();
msf.Close();
stem.Close();
return true;
}
catch { return false; }
}
私はマニフェストにこれを持っています。SDKVersion を変更すると、ファイルの保存が停止し、フリーズします。任意の推奨事項。
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
LogCat:
06-29 16:08:48.522: D/dalvikvm(8660): threadid=1: 元に戻した後も中断されています (sc=1 dc=1) 06-29 16:10:26.225: D/AndroidRuntime(8660): シャットダウンしていますVM 06-29 16:10:26.225: W/dalvikvm(8660): threadid=1: キャッチされない例外で終了するスレッド (group=0x409c01f8) 06-29 16:10:26.292: E/AndroidRuntime(8660): 致命的な例外:メイン 06-29 16:10:26.292: E/AndroidRuntime(8660): java.lang.NullPointerException 06-29 16:10:26.292: E/AndroidRuntime(8660): com.micsoftwares.iltc.GalleryRegister$UploadTask.onPostExecute で(GalleryRegister.java:51) 06-29 16:10:26.292: E/AndroidRuntime(8660): com.micsoftwares.iltc.GalleryRegister$UploadTask.onPostExecute (GalleryRegister.java:1) 06-29 16:10:26.292 : E/AndroidRuntime(8660): android.os.AsyncTask.finish(AsyncTask.java:602) 06-29 16:10:26.292: E/AndroidRuntime(8660): android.os.AsyncTask.access$600(AsyncTask.java:156) 06-29 16:10:26.292: E/AndroidRuntime(8660): android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 06-29 16:10:26.292 : E/AndroidRuntime(8660): android.os.Handler.dispatchMessage(Handler.java:99) 06-29 16:10:26.292: E/AndroidRuntime(8660): android.os.Looper.loop(Looper. java:137) 06-29 16:10:26.292: E/AndroidRuntime(8660): android.app.ActivityThread.main(ActivityThread.java:4424) 06-29 16:10:26.292: E/AndroidRuntime(8660) : java.lang.reflect.Method.invokeNative(Native Method) 06-29 16:10:26.292: E/AndroidRuntime(8660): java.lang.reflect.Method.invoke(Method.java:511) 06- 29 16:10:26.292: E/AndroidRuntime(8660): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 06-29 16:10:26.292: E/AndroidRuntime(8660) : com.android で。internal.os.ZygoteInit.main (ZygoteInit.java:551) 06-29 16:10:26.292: E/AndroidRuntime (8660): dalvik.system.NativeStart.main (ネイティブ メソッド) で