3

ギャラリーから2枚の写真を撮ったり選択したりしてサーバーに送信できるAndroidアプリを作成しようとしています。コード:

private static final int SELECT_PICTURE = 1;
private String selectedImagePath;
private int TAKE_PHOTO_CODE = 0;
private Uri outputFileUri;

public void getit() {
    Intent intentpic= new Intent();
    intentpic.setAction(Intent.ACTION_GET_CONTENT);
    intentpic.setType("image/*");
    startActivityForResult(Intent.createChooser(intentpic, "Select Picture"), SELECT_PICTURE);
}

public void takepic() {
    final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/IDandCCD/"; 
    File newdir = new File(dir); 
    newdir.mkdirs();  

    String file="";
    if(but.equals(3)) {
        file = dir+"ID"+".jpg";
    }
    else if(but.equals(4)) {
        file = dir+"CCD"+".jpg";
    }
    File newfile = new File(file);
    try {
        newfile.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }       

    outputFileUri = Uri.fromFile(newfile);

    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

    startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();              
            selectedImagePath = getPath(selectedImageUri);

            //selectedImagePath = selectedImageUri.getPath()+".jpg";

            if(but.equals(1)) {
                id.setText(selectedImagePath);
            }
            else if(but.equals(2)) {
                ccd.setText(selectedImagePath);
            }
        }
        else if(requestCode == TAKE_PHOTO_CODE) {
            String fname = outputFileUri.getPath();
            if(but.equals(3)) {
                id.setText(fname);
            }
            else if(but.equals(4)) {
                ccd.setText(fname);
            }
        }
    }
}

@SuppressWarnings(value = { "deprecation" }) 
public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    if(cursor!=null)
    {
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    else return null;
}
private class MyAsyncTask extends AsyncTask<String, Void, String> {
    ProgressDialog pro1;

    protected void onPostExecute(String result) {
        pro1.dismiss();
        }

    @Override
    protected void onPreExecute() {
        pro1 = ProgressDialog.show(ThirdStep.this, "Loading", "Please wait");
        }

    @Override
    protected String doInBackground(String... params) {
        String hdfgs="tgabvds";
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(params[0]);
        String responseStr=null;
        try {
          MultipartEntity entity = new MultipartEntity();
          FileBody pic1=new FileBody(new File(id.getText().toString()));
          FileBody pic2=new FileBody(new File(ccd.getText().toString()));
          entity.addPart("idpic", pic1);
          entity.addPart("ccdpic", pic2);              
          httppost.setEntity(entity);
          HttpResponse response = httpclient.execute(httppost);
          HttpEntity resEntity=response.getEntity();
          responseStr=resEntity.toString();
        } catch (Exception e)   {
            Log.e("Debug", "error: " + e.getMessage(), e);
        }
        return responseStr;
        }
    }

しかし、私は問題に遭遇しました:

08-20 12:45:20.409: D/dalvikvm(2235): DexOpt: couldn't find static field Lorg/apache/http/message/BasicHeaderValueParser;.INSTANCE
08-20 12:45:20.409: W/dalvikvm(2235): VFY: unable to resolve static field 2667 (INSTANCE) in Lorg/apache/http/message/BasicHeaderValueParser;
08-20 12:45:20.482: D/dalvikvm(2235): VFY: replacing opcode 0x62 at 0x001b
08-20 12:45:20.502: D/dalvikvm(2235): DexOpt: couldn't find static field Lorg/apache/http/message/BasicHeaderValueFormatter;.INSTANCE
08-20 12:45:20.528: W/dalvikvm(2235): VFY: unable to resolve static field 2661 (INSTANCE) in Lorg/apache/http/message/BasicHeaderValueFormatter;
08-20 12:45:20.528: D/dalvikvm(2235): VFY: replacing opcode 0x62 at 0x0015
08-20 12:45:22.618: D/dalvikvm(2235): GREF has increased to 201

最初は、MultipartEntity のインポートされた jar が原因だと思っていましたが、プロジェクトの libs フォルダーに配置すると、Android Private Libraries に表示されます。それらを追加した後、プロジェクトを更新してクリーンアップしました。私はEclipseでこれを行っています。エミュレーターでアプリを起動すると、写真を撮ることができます。電話から写真を選択できますが、アップロードしようとするとエラーが発生します。誰か提案があれば、私はそれを感謝します。

PS私はそれを見落としていませんでした。それは、結果に対してまだ何もしていないということです。

4

1 に答える 1

1

これを機能させることができなかったので、代わりに Base64 エンコーディングと BasicNameValuePair を使用して、その方法でアップロードすることができました。とにかく、誰かが質問のコードのどこが間違っていたのか、そしてそれを修正する方法について考えを持っているなら、私は知りたい.

現在は問題なく動作します。コードは次のとおりです。

private void filesToSend() {
    File f1=new File(id.getText().toString());
    File f2=new File(ccd.getText().toString());
    if (f1.exists()&&f2.exists()) {
        Bitmap bip1=BitmapFactory.decodeFile(f1.getAbsolutePath());
        Bitmap bip2=BitmapFactory.decodeFile(f2.getAbsolutePath());
        ByteArrayOutputStream stream1=new ByteArrayOutputStream();
        ByteArrayOutputStream stream2=new ByteArrayOutputStream();
        bip1.compress(Bitmap.CompressFormat.JPEG, 90, stream1); //compress to which format you want.
        bip2.compress(Bitmap.CompressFormat.JPEG, 90, stream2);
        byte [] byte_arr1=stream1.toByteArray();
        byte [] byte_arr2=stream2.toByteArray();
        image_str1=Base64.encodeToString(byte_arr1, Base64.DEFAULT);
        image_str2=Base64.encodeToString(byte_arr2, Base64.DEFAULT);
        RSet=true;
    }

次の部分は私の AsyncTask にあります。

protected String doInBackground(String... params) {
        String result=null;
        String response=null;
        ArrayList<NameValuePair> postparams=new  ArrayList<NameValuePair>();
        postparams.add(new BasicNameValuePair("idpic", params[0]));
        postparams.add(new BasicNameValuePair("ccdpic", params[1]));
        try {
            response=CustomHttpClient.executeHttpPost(params[2], postparams);
            result=response.toString();
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
        }
        return result;
        }

そして、ボタンをクリックすると:

filesToSend();
            String url="http://10.0.2.2/Android/tstep.php";
            if(RSet.equals(true)) {
                new MyAsyncTask().execute(image_str1, image_str2, url);
            }
            else if(RSet.equals(false)) {
                tostVLong("The images are not set, please choose or take a picture before sending.");
            }   

PS私は、このサイトの回答の1つから取得したカスタムhttpクライアントを使用していますが、どれを思い出せません...また、tostVLongは、表示時間が延長されたトーストです。

于 2013-08-22T15:03:21.100 に答える