在android中构建照片上传应用程序

时间:2011-05-18 09:19:46

标签: android

  

可能重复:
  Calling camera from an activity, capturing an image and uploading to a server

我需要构建一个应用程序来启动相机,拍照,将该照片保存到SD卡,然后将此照片上传到.net服务器而不改变它的质量,任何人都有想法?

4 个答案:

答案 0 :(得分:12)

您已经编写了解决方案^^要启动相机应用程序,请使用:

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    captured_image = System.currentTimeMillis() + ".jpg";
    File file = new File(Environment.getExternalStorageDirectory(), captured_image); 
    captured_image = file.getAbsolutePath();
    Uri outputFileUri = Uri.fromFile(file); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
    intent.putExtra("return-data", true);
    ((Activity) GlobalVars.main_ctx).startActivityForResult(intent, RES_IMAGE_CAPTURE); 

然后你需要一个ActivityResulListener Like:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    switch (requestCode) { 
        case RES_IMAGE_CAPTURE: 

            Log.i( "MakeMachine", "resultCode: " + resultCode );
            switch( resultCode )
            {
                case 0:
                    Log.i( "MakeMachine", "User cancelled" );
                    break;
                case -1:
                    //image storead, now load it in the web
                    break;
                }
            break;

    }   
}

存储图片后,你必须执行一个Post Request来加载网页中的图片,你需要将文件复制到服务器的脚本,也许是asp.net,而你只需要执行请求。我只有一个带有凭据的https请求代码,使用来自appache的外部库,这可能有点太复杂,但我相信你会在这里找到代码,否则我的解决方案看起来像:

public static boolean upload_image(String url, List<NameValuePair> nameValuePairs,String encoding) {

    DefaultHttpClient http = new DefaultHttpClient();
        SSLSocketFactory ssl =  (SSLSocketFactory)http.getConnectionManager().getSchemeRegistry().getScheme( "https" ).getSocketFactory(); 
        ssl.setHostnameVerifier( SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER );
        final String username = "username";
        final String password = "password";
        UsernamePasswordCredentials c = new UsernamePasswordCredentials(username,password);
        BasicCredentialsProvider cP = new BasicCredentialsProvider(); 
        cP.setCredentials(AuthScope.ANY, c); 
        http.setCredentialsProvider(cP);
        HttpResponse res;
        try {
            HttpPost httpost = new HttpPost(url);
            MultipartEntity entity = new MultipartEntity(HttpMultipartMode.STRICT); 

            for(int index=0; index < nameValuePairs.size(); index++) { 
                ContentBody cb;
                if(nameValuePairs.get(index).getName().equalsIgnoreCase("File")) { 
                    File file = new File(nameValuePairs.get(index).getValue());
                    FileBody isb = new FileBody(file,"application/*");
                    entity.addPart(nameValuePairs.get(index).getName(), isb);
                } else { 
                    // Normal string data 
                    cb =  new StringBody(nameValuePairs.get(index).getValue(),"", null);
                    entity.addPart(nameValuePairs.get(index).getName(),cb); 
                } 
            } 


            httpost.setEntity(entity);
            res = http.execute(httpost);

            InputStream is = res.getEntity().getContent();
            BufferedInputStream bis = new BufferedInputStream(is);
            ByteArrayBuffer baf = new ByteArrayBuffer(50);
            int current = 0;
            while((current = bis.read()) != -1){
                  baf.append((byte)current);
             }
            res = null;
            httpost = null;
            String ret = new String(baf.toByteArray(),encoding);
            GlobalVars.LastError = ret;
            return  true;
           } 
        catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            return true;
        } 
        catch (IOException e) {
            // TODO Auto-generated catch block
            return true;
        } 

} 

答案 1 :(得分:1)

拍照使用此代码

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File file = new File(Environment.getExternalStorageDirectory(), "test.jpg");
        outputFileUri = Uri.fromFile(file);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        startActivityForResult(intent, TAKE_PICTURE);

用于保存你的照片

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){

        if (requestCode == TAKE_PICTURE)
        {
            //Uri contentURI = Uri.parse(data.getDataString()); 

            ContentResolver cr = getContentResolver();
            InputStream in = null;
            try 
            {
                in = cr.openInputStream(outputFileUri); 
                Log.i("URI ===> ", outputFileUri.getPath());
            } 
            catch (FileNotFoundException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if(in!=null)
            {

                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize=8;
                bit = BitmapFactory.decodeStream(in,null,options);

            }

        }

最后将照片上传到服务器尝试使用kso​​ap webservices

答案 2 :(得分:1)

您可以使用拍摄照片

拍摄照片
startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), TAKE_PICTURE);

也请参考http://developer.android.com/reference/android/provider/MediaStore.html

答案 3 :(得分:0)

参考Android示例,有很多相机使用示例和http示例。

http://developer.android.com/reference/android/hardware/Camera.html http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

试试谷歌,有很多例子。如果您遇到具体问题,请询问。

好运。