我正在尝试制作一个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

起初我以为这是因为导入的jar的多部分性,但我把它们放在项目的libs文件夹中,它们出现在android私有库中。添加之后,我刷新并清理了项目。
我在eclipse中这样做,当我在模拟器中启动应用程序时,我可以拍摄一张照片,我可以从手机中选择一张照片,但是当我尝试上传时,我得到了错误。
如果有人提出建议,我将不胜感激。
我没有忽视这一点,只是我还没有对结果做任何事情。

最佳答案

我无法让它工作,所以我使用了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;
    }

下一部分在我的异步任务中:
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.");
            }

我正在使用一个自定义的http客户端,我从这个网站的答案之一,只是不记得哪一个…Tostvlong也是一个祝酒词,延长了演出时间。

08-07 16:01