1

在我的应用程序中,我试图将图像上传到使用 REST 技术接收的服务。

我将我的意图设置为 Launch the Camera Function 和 onActionResult 来处理图像并将其传递给 AsyncTask 处理它到服务器。

代码:

package com.testingapp;

import java.io.File;
import java.io.IOException;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.hardware.Camera;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Images.ImageColumns;
import android.provider.MediaStore.MediaColumns;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;

@SuppressLint("NewApi")
public class HomeActivity extends Activity {
    final static String DEBUG_TAG = "MakePhotoActivity";
    protected static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;
    private Camera camera;
    private int cameraId = 0;
    HttpEntity resEntity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActionBar actionBar = getActionBar();
        actionBar.setTitle("My Relocation");
        actionBar.setIcon(R.drawable.menu_ic_launcher);
        setContentView(R.layout.activity_home);
        Bundle bundle = getIntent().getExtras();
        final int cameraId = 0;
        final TextView welcomeText = (TextView) findViewById(R.id.WelcomeText);
        final TextView relocationId = (TextView) findViewById(R.id.RelocationID);
        final TextView addressOne = (TextView) findViewById(R.id.addressOne);
        final TextView addressTwo = (TextView) findViewById(R.id.addressTwo);
        final String RelocationId = bundle.getString("UID");
        relocationId.setText("Your Relocation: #" + RelocationId);


        findViewById(R.id.viewMyContacts).setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        String UserId = RelocationId;
                        Intent intent = new Intent(HomeActivity.this,
                                MoveContactsActivity.class);
                         intent.putExtra("UID1", UserId);
                        startActivity(intent);
                    }
                });
        findViewById(R.id.viewMyExpenses).setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        String UserId = RelocationId;
                        Intent intent = new Intent(HomeActivity.this,
                                ViewRecieptsActivity.class);
                         intent.putExtra("UID3", UserId);
                        startActivity(intent);
                    }
                });
        findViewById(R.id.viewMyMoveDates).setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        String UserID1 = RelocationId;
                        Intent intent = new Intent(HomeActivity.this,
                                MoveDatesActivity.class);
                        intent.putExtra("UID2", UserID1);
                        startActivity(intent);
                    }
                });
        findViewById(R.id.viewExpenseReceipts).setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View view) {
                    }
                });
        findViewById(R.id.captureReceiptPhotoButton).setOnClickListener(
                new OnClickListener() {
                    @SuppressLint("NewApi")
                    @Override
                    public void onClick(View view) {
                        // if (cameraCheck() == true) {
                        // camera.takePicture(null, null, new PhotoHandler(
                        // HomeActivity.this));
                        // }
                        String fileName = "TempPhoto";
                        ContentValues values = new ContentValues();
                        values.put(MediaColumns.TITLE, fileName);
                        values.put(ImageColumns.DESCRIPTION,
                                "Temporary Photo from Recipt Photo Taker");
                        File imageUri = new File(Environment.getExternalStorageDirectory(), "com.testingapp/");
                        if(!imageUri.exists()){
                            imageUri.mkdir();
                        }
                        Intent intent = new Intent(
                                MediaStore.ACTION_IMAGE_CAPTURE);
                        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
                        startActivityForResult(intent,
                                CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
                    }
                });
        findViewById(R.id.WebAddress).setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                Uri uri = Uri.parse("http://www.Relocationmw.com");
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);  
            }

        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_home, menu);
        return true;
    }

    public boolean cameraCheck() {
        int Cameras = Camera.getNumberOfCameras();
        if (Cameras > 0) {
            return true;
        } else {
            return false;
        }
    }

    private File getTempFile(Context context){
          //it should return /sdcard0/TempPhoto
          final File path = new File( Environment.getExternalStorageDirectory(), "com.testingapp/" );
          if(!path.exists()){
            path.mkdir();
          }
          return new File(path, "TempPhoto");
        }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                Bundle CameraBundle = getIntent().getExtras();
                // Grab image with Uri, Turn into Image and send through AsyncTask.
                final File file = getTempFile(this);
//              try {
//                Bitmap captureBmp = Media.getBitmap(getContentResolver(), Uri.fromFile(file) );
                  // do whatever you want with the bitmap (Resize, Rename, Add To Gallery, etc)
                  new ImageUpload().execute(file);
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Picture was not taken",
                        Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Picture was not taken",
                        Toast.LENGTH_SHORT).show();
            }
        }
    }

    // Handle the conversion of File to Bitmap for Sending through Intent to
    // PhotoPreview
    private class ImageUpload extends AsyncTask<File, Void, String> {

        @Override
        protected void onPreExecute() {
            if (checkNullState() == false) {
                showMyDialog();
            }
        }

        @Override
        protected String doInBackground(File... file) {

            String imageDescriptionTemp = "Photo Temp Description.";
            String PostRequestUri = "https://demo.relocationmw.com/ws_docmgmt/Service1.svc";
            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(PostRequestUri);
            FileBody bin1 = new FileBody(file[0]);
            MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
            entity.addPart("Image", bin1);
            post.setEntity(entity);
            HttpResponse response;
            try {
                response = client.execute(post);
                resEntity = response.getEntity();
                final String response_string = EntityUtils.toString(resEntity);
                if(resEntity != null){
                Log.i("RESPONSE", response_string); 
                }
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            if (checkNullState() == true) {
                dismissMyDialog();
            }
            // add location once we have that figured out.
            Toast.makeText(HomeActivity.this, "Image can be viewed {Location}",
                    Toast.LENGTH_LONG).show();
        }

        protected void onProgressUpdate(Map... values) {
        }


    // ProgressDialog Tracking
    private ProgressDialog pd1;
    private boolean isMyDialogShowing;

    boolean checkNullState() {
        boolean test;
        if (pd1 != null) {
            test = true;
        } else {
            test = false;
        }
        return test;
    }

    void showMyDialog() {
        isMyDialogShowing = true;
        pd1 = new ProgressDialog(HomeActivity.this);
        pd1.setTitle("Image Uploading");
        pd1.setMessage("Uploading Image....");
        pd1.show();
    }

    void dismissMyDialog() {
        pd1.dismiss();
        isMyDialogShowing = false;
    }

}
}

那就是整个活动。

这是LogCat:

04-11 09:51:32.090: W/System.err(26030): java.io.FileNotFoundException: /storage/sdcard0/com.testingapp/TempPhoto: open failed: ENOENT (No such file or directory)
04-11 09:51:32.095: W/System.err(26030):    at libcore.io.IoBridge.open(IoBridge.java:416)
04-11 09:51:32.095: W/System.err(26030):    at java.io.FileInputStream.<init>(FileInputStream.java:78)
04-11 09:51:32.100: W/System.err(26030):    at org.apache.http.entity.mime.content.FileBody.writeTo(FileBody.java:92)
04-11 09:51:32.100: W/System.err(26030):    at org.apache.http.entity.mime.HttpMultipart.doWriteTo(HttpMultipart.java:206)
04-11 09:51:32.100: W/System.err(26030):    at org.apache.http.entity.mime.HttpMultipart.writeTo(HttpMultipart.java:224)
04-11 09:51:32.105: W/System.err(26030):    at org.apache.http.entity.mime.MultipartEntity.writeTo(MultipartEntity.java:183)
04-11 09:51:32.105: W/System.err(26030):    at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:97)
04-11 09:51:32.105: W/System.err(26030):    at org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:162)
04-11 09:51:32.105: W/System.err(26030):    at org.apache.http.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:272)
04-11 09:51:32.105: W/System.err(26030):    at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:237)
04-11 09:51:32.110: W/System.err(26030):    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:119)
04-11 09:51:32.110: W/System.err(26030):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:428)
04-11 09:51:32.110: W/System.err(26030):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
04-11 09:51:32.110: W/System.err(26030):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
04-11 09:51:32.115: W/System.err(26030):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
04-11 09:51:32.115: W/System.err(26030):    at com.testingapp.HomeActivity$ImageUpload.doInBackground(HomeActivity.java:220)
04-11 09:51:32.115: W/System.err(26030):    at com.testingapp.HomeActivity$ImageUpload.doInBackground(HomeActivity.java:1)
04-11 09:51:32.115: W/System.err(26030):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-11 09:51:32.115: W/System.err(26030):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-11 09:51:32.120: W/System.err(26030):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-11 09:51:32.120: W/System.err(26030):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
04-11 09:51:32.120: W/System.err(26030):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
04-11 09:51:32.125: W/System.err(26030):    at java.lang.Thread.run(Thread.java:856)
04-11 09:51:32.125: W/System.err(26030): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
04-11 09:51:32.125: W/System.err(26030):    at libcore.io.Posix.open(Native Method)
04-11 09:51:32.130: W/System.err(26030):    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
04-11 09:51:32.130: W/System.err(26030):    at libcore.io.IoBridge.open(IoBridge.java:400)
04-11 09:51:32.130: W/System.err(26030):    ... 22 more

我几乎 100% 确定我的导入是正确的,但我不明白为什么它不会从我指定保存到的位置获取文件。

任何帮助将不胜感激!

4

1 回答 1

2

我相信相机希望使用“.jpg”文件扩展名保存您的图像。

请更改您的"TempPhoto"文件名,如下所示:

String fileName = "TempPhoto.jpg";

您还必须在以下方面进行相同的更改getTempFile()

return new File(path, "TempPhoto.jpg");

imageUri应包括fileName如下intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri)

File imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "com.testingapp/" + fileName));

进一步的例子

如何使用本机选择菜单从相机或图库中捕获您的照片:允许用户选择相机或图库以获得图像 - 投票总数证明了社区的高度信任

于 2013-04-11T16:19:55.943 回答