почему не работает okhttp3 client.execute? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть простое приложение flask, которое берет изображение и возвращает прогноз из модели keras

flask код

@app.route('/route', methods=['GET','POST'])
def rose():

    model = load_model('model.h5')
    model.compile(loss='categorical_crossentropy',
                  optimizer='rmsprop',
                  metrics=['accuracy'])

    img_width, img_height = 128, 128
    img = Image.open(request.files['file'])
    if img.mode != "RGB":
        img.convert("RGB")
    img = img.resize((img_width, img_height))

    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)

    images = np.vstack([x])
    classes = model.predict(images)

    return str(classes )

Мне нужно загрузить изображение из android приложение, использующее комплект камеры- android: вот мой код:

package com.bostanji.wardeh.ui.home;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.media.Image;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import com.bostanji.wardeh.R;
import com.wonderkiln.camerakit.CameraKitError;
import com.wonderkiln.camerakit.CameraKitEvent;
import com.wonderkiln.camerakit.CameraKitEventListener;
import com.wonderkiln.camerakit.CameraKitImage;
import com.wonderkiln.camerakit.CameraKitVideo;
import com.wonderkiln.camerakit.CameraView;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.net.Socket;
import java.util.List;
import java.util.concurrent.TimeUnit;

import dmax.dialog.SpotsDialog;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class HomeFragment extends Fragment {

    private CameraView cameraView;
    private Button button;

    private AlertDialog waitingDialog;
    private Dialog emptyDialog;

    @Override
    public void onResume() {
        super.onResume();
        cameraView.start();
    }

    @Override
    public void onPause() {
        super.onPause();
        cameraView.stop();
    }

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        View root = inflater.inflate(R.layout.fragment_home, container, false);
        cameraView = root.findViewById(R.id.camera);
        button = root.findViewById(R.id.btn_detect);
        waitingDialog = new SpotsDialog.Builder().setContext(getContext()).setMessage("Please wait").setCancelable(false).build();

        cameraView.addCameraKitListener(new CameraKitEventListener() {
            @Override
            public void onEvent(CameraKitEvent cameraKitEvent) {

            }

            @Override
            public void onError(CameraKitError cameraKitError) {

            }

            @Override
            public void onImage(final CameraKitImage cameraKitImage) {

                //waitingDialog.show();
                Bitmap bitmap = cameraKitImage.getBitmap();
                final byte[] img = cameraKitImage.getJpeg();
                final Bitmap uploadMap = bitmap;
                bitmap = Bitmap.createScaledBitmap(bitmap, cameraView.getWidth(), cameraView.getHeight(), false);

                cameraView.stop();
                waitingDialog.show();
                final Handler handler = new Handler();



                new Thread(){
                    @Override
                    public void run() {
                        try {


                            OkHttpClient client = new OkHttpClient();

                            String postUrl= "flaskapp.com/route";
                            final MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg");
                            RequestBody req = new MultipartBody.Builder().setType(MultipartBody.FORM)
                                    .addFormDataPart("file","rose.jpeg", RequestBody.create(img, MEDIA_TYPE_JPEG)).build();

                            Request request = new Request.Builder()
                                    .url(postUrl)
                                    .post(req)
                                    .build();

                            try {
                                Response response = client.newCall(request).execute();
                                final String r = response.body().string();


                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        waitingDialog.dismiss();
                                        Toast.makeText(getContext(), r, Toast.LENGTH_LONG).show();

                                    }
                                });

                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        } catch (Exception e) {

                        }
                    }
                }.start();

            }

            @Override
            public void onVideo(CameraKitVideo cameraKitVideo) {

            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cameraView.start();
                cameraView.captureImage();

            }
        });

        return root;
    }


}

как только я нажимаю кнопку, чтобы сделать снимок и загрузить его, появится диалоговое окно ожидания и останется таким навсегда. PS Мне не нужно отправлять в почтовом запросе что-либо кроме изображения и ждать ответа

1 Ответ

0 голосов
/ 09 мая 2020

Вы используете устаревший конструктор, который подвержен ошибкам. Было бы лучше использовать final Handler handler = new Handler(Looper.getMainLooper()); Кроме того, вы просто отправляете свое сообщение, когда почтовый запрос был успешным. Если это не удастся, диалоговое окно ожидания останется навсегда. Таким образом, он обновит ваш код:

@Override
public void onImage(final CameraKitImage cameraKitImage) {

 //waitingDialog.show();
 Bitmap bitmap = cameraKitImage.getBitmap();
 final byte[] img = cameraKitImage.getJpeg();
 final Bitmap uploadMap = bitmap;
 bitmap = Bitmap.createScaledBitmap(bitmap, cameraView.getWidth(), cameraView.getHeight(), false);

 cameraView.stop();
 waitingDialog.show();
 final Handler handler = new Handler(Looper.getMainLooper());


 new Thread(){
   @Override
   public void run() {
     try {


       OkHttpClient client = new OkHttpClient();

       String postUrl= "flaskapp.com/route";
       final MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg");
       RequestBody req = new MultipartBody.Builder().setType(MultipartBody.FORM)
                               .addFormDataPart("file","rose.jpeg", RequestBody.create(img, MEDIA_TYPE_JPEG)).build();

       Request request = new Request.Builder()
        .url(postUrl)
        .post(req)
        .build();

       Response response = client.newCall(request).execute();
       final String r = response.body().string();

     } catch (Exception e) {
       Log.e('Camera', 'POST failed', e);
     } finally {
       handler.post(new Runnable() {
          @Override
          public void run() {                                                     
            waitingDialog.dismiss();

            Toast.makeText(getContext(), r, Toast.LENGTH_LONG).show();

          }
        });
     }
   }.start();

 }
...