gpt4 book ai didi

Android - 向服务器发送 2 个文件

转载 作者:太空狗 更新时间:2023-10-29 14:19:17 25 4
gpt4 key购买 nike

我正在尝试制作一个 Android 应用程序,我可以在其中从图库中拍摄或选择 2 张照片并将它们发送到服务器。代码:

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)库中。添加它们后,我刷新并清理了项目。我在 Eclipse 中执行此操作,当我在模拟器中启动应用程序时,我可以拍照,我可以从手机中选择一张照片,但是当我尝试上传它时出现错误。如果有人有建议,我将不胜感激。

PS 我没有忽略它,只是我还没有对结果做任何事情。

最佳答案

我无法让它工作,所以我改用 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 我使用的是自定义的 http 客户端,我是从本网站的一个答案中获得的,只是不记得是哪一个...另外 tostVLong 是一个显示时间延长的 toast 。

关于Android - 向服务器发送 2 个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18336256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com