Как я могу использовать Android HTTPPOST JPEG на сервер Django? - PullRequest
2 голосов
/ 27 февраля 2012

Это мое первое приложение для Android, и я пытаюсь отправить изображения, снятые на камеру (ICS 4.0), на сервер Django.Я получаю сообщение об ошибке исключения NULL-указателя, но не знаю, где это происходит.Кроме того, когда я не вижу приложение вылетает при попытке загрузки.Я не уверен, что происходит.Я использую фрагменты.

Вот мой почтовый индекс Django:

    def post(self, request, *args, **kwargs):
        image = get_object_or_404(Img, **kwargs)

        inst = Instance(stream=image.stream)
        uploaded_file = \
            File('-.jpg', self.FILES[0].read(), 'image/jpeg')
        setattr(inst, 'full', uploaded_file)
        inst.save()

        return HttpResponse(status=HTTP_201_CREATED)

Вот что я имею в своем фрагменте после действия камеры:

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            // put the image onto server
            text.setText(outputFileUri.toString());

            try {
                HttpClient httpClient = new DefaultHttpClient();
                HttpContext localContext = new BasicHttpContext();
                HttpPost postRequest = new HttpPost("http://192.168.1.2:8000/v1/14/1/imagesink/1/");
                MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

                bm = BitmapFactory.decodeFile("/sdcard/test.jpg");
                Bitmap bmpCompressed = Bitmap.createScaledBitmap(bm, 640, 480, true);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                bmpCompressed.compress(CompressFormat.JPEG, 100, bos);
                byte[] bytes = bos.toByteArray();
                reqEntity.addPart("myImage", new ByteArrayBody(bytes, "temp.jpg")); 
                postRequest.setEntity(reqEntity);
                HttpResponse response = httpClient.execute(postRequest,localContext);

                BufferedReader reader = new BufferedReader(new InputStreamReader( response.getEntity().getContent(), "UTF-8"));  
                String sResponse = reader.readLine();

            } catch (Exception e) {
                // handle exception here
                Log.v("myApp", "Some error came up");  
            }

        } else if (resultCode == Activity.RESULT_CANCELED) {
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
        }
    }
}

Спасибозаранее!

ОШИБКА:

     E/AndroidRuntime(19787): FATAL EXCEPTION: main
     java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=1, result=-1, data=null} to activity {com.prism.app/com.prism.app.PrismActivity}: java.lang.NullPointerException: println needs a message
     at android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3019)
     at android.app.ActivityThread.access$1100(ActivityThread.java:122)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1176)
     at android.os.Handler.dispatchMessage(Handler.java:99)
     at android.os.Looper.loop(Looper.java:137)
     at android.app.ActivityThread.main(ActivityThread.java:4340)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:511)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
 at dalvik.system.NativeStart.main(Native Method)
         Caused by: java.lang.NullPointerException: println needs a message
 at android.util.Log.println_native(Native Method)
 at android.util.Log.e(Log.java:231)
 at com.prism.app.OneFragmentTab.onActivityResult(OneFragmentTab.java:106)
     at android.app.Activity.dispatchActivityResult(Activity.java:4653)
     at android.app.ActivityThread.deliverResults(ActivityThread.java:2972)
     ... 11 more

1 Ответ

0 голосов
/ 11 октября 2012

следующий код - как захватить изображение

    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(cameraIntent, CAMERA_REQUEST); 

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

       if (requestCode == CAMERA_REQUEST)
   {  
       Bitmap photo = (Bitmap) data.getExtras().get("data");  
   }    
}

после получения изображения в растровое изображение, а затем преобразовать растровое изображение в кодировку Base64 в строке. Следующим методом является преобразование растрового изображения в строку

  public String convert_bitmap_to_string(Bitmap bitmap)
    {
            ByteArrayOutputStream full_stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, full_stream);
        byte[] full_bytes = full_stream.toByteArray();
        String Str_image = Base64.encodeToString(full_bytes, Base64.DEFAULT);

        return Str_image; 
    }

после преобразования ImageString отправьте эту ImageString, используя метод Http Post

      HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://www.URL...");
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);

    nameValuePairs.add(new BasicNameValuePair("param name",Str_image));

    HttpResponse response = httpclient.execute(httppost);
      HttpEntity entity = response.getEntity();
       String responseText = EntityUtils.toString(entity);
...