2

マルチパートとストリームを使用してライブ サーバー (WCF サービス) に画像ファイルをアップロードしています。実際のカメラを使用する場合、画像サイズは 500 ~ 700KB です。エミュレーターからはサンプルを正常にアップロードできますが、Sony Ericsson Arc S にインストールすると、アプリケーションは画像をアップロードしません。ステータスコードを確認するためのコードがありますが、何も起こらず、エラーも例外もサーバーの応答もありません.私の電話では、モバイルデータ接続を使用しています(プロバイダーグラメン電話、GSM、バングラデシュ)。何が問題なのか理解できません。どんな体でも私を助けることができますか?

アンドロイドコード:

 HttpPost httppost = new HttpPost(SERVICE_URI + "/uploadImage");
                DefaultHttpClient httpclient = new DefaultHttpClient();
                File dir = Environment.getExternalStorageDirectory();
                File imageFile = new File(dir, getImagepath(directoryName, false));     
                if (imageFile.exists()) {
                  MainActivity.this.runOnUiThread(new Runnable() {
                        public void run() {
                            Toast.makeText(MainActivity.this, "File Exist", Toast.LENGTH_SHORT)
                                    .show();
                        }
                    });

                    MultipartEntity entity = new MultipartEntity();
                    entity.addPart("image", new FileBody(imageFile, "image/jpeg"));
                    httppost.setEntity(entity);

                    HttpResponse response = httpclient.execute(httppost);
                    StatusLine statusLine = response.getStatusLine();
                    final int statusCode = statusLine.getStatusCode();

                    if (statusCode == 200) {
                         MainActivity.this.runOnUiThread(new Runnable() {
                                public void run() {
                                    Toast.makeText(MainActivity.this, "Upload successful!", Toast.LENGTH_SHORT)
                                            .show();
                                }
                            });
                    } else {
                         MainActivity.this.runOnUiThread(new Runnable() {
                                public void run() {
                                    Toast.makeText(MainActivity.this, "File Upload Failed,status:"+statusCode, Toast.LENGTH_SHORT)
                                            .show();
                                }
                            });
                    }
                } else {
                     MainActivity.this.runOnUiThread(new Runnable() {
                            public void run() {
                                Toast.makeText(MainActivity.this, "File dont't exist", Toast.LENGTH_SHORT)
                                        .show();
                            }
                        });
                }

更新: ログ ファイルを生成する例外キャッチ ブロックにログ ライターを追加しました。どうしたの。

更新: ついに問題が発生しました!それはサーバー側の「マルチパート パーサー」であり、Android コードで間違った ServiceURi を使用していました。必要に応じてパーサーを選択するように注意する必要があります。パーサー ファイルにほとんど変更を加えませんでした。 、そしてそれはうまくいきます!しかし、他の多くのスタッフを組み込む必要があるため、パーサーを変更する必要があります.とにかく、あなたの努力に感謝します! 便利なリンク: http://www.ideatoappster.com/android-to-wcf-streaming-multi-part-binary-images/

4

2 に答える 2

0

これは、サーバーのファイアウォールの問題のようです。接続が拒否されたということは、マシンに到達したが、接続を受け入れるサービスが実行されていなかったか、ファイアウォールによってブロックされていたことを意味します。

于 2013-03-12T18:34:18.730 に答える
0

このメソッドを使用して、Uri パスを文字列に変換します

public String getImagepath(Uri uri) {
        String[] largeFileProjection = { MediaStore.Images.ImageColumns._ID,
                MediaStore.Images.ImageColumns.DATA };
        String largeFileSort = MediaStore.Images.ImageColumns._ID + " DESC";
        Cursor myCursor = this.managedQuery(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                largeFileProjection, null, null, largeFileSort);
        String largeImagePath = "";
        try {
            myCursor.moveToFirst();
            largeImagePath = myCursor
                    .getString(myCursor
                            .getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));
        } finally {
            myCursor.close();
        }
        return largeImagePath;
    }



public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);

        switch (requestCode) {
                 case PICK_FROM_CAMERA:
            if (resultCode == Activity.RESULT_OK) {
                   Uri  mImageCaptureUri = intent.getData();

                Bitmap bitmapImage = (Bitmap)intent.getExtras().get("data");
                         }
}

この Uri onActivityResult の文字列パスを取得するため

これを getImagepath(mImageCaptureUri ) と呼びます

キャプチャ画像のパスを取得する際に問題が発生する可能性があります。この getImagepath() 関数を試してください。

これで問題が解決することを願っています。

于 2013-03-12T09:36:56.013 に答える