Отправка изображения в определенной сети с помощью IntentService - PullRequest
1 голос
/ 10 апреля 2020

Я пытался отправить изображение, используя определенную сеть, изображение успешно отправляется, когда я не упоминаю о какой-либо сети. Я пробовал это с Asyn c задача и IntentService. Также, если я не упоминаю ни о какой сети, и состояние приложения работает, когда я пытаюсь отключить Wi-Fi, а затем включаю его снова, изображение не отправляется.

Заранее спасибо

Класс обслуживания

public class ImageService extends IntentService {

    public ImageService() {
        super("HelloIntentService");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    protected void onHandleIntent(@Nullable final Intent intent) {

        new Thread(new Runnable() {
            @Override
            public void run () {
                byte[] bytesss=intent.getByteArrayExtra("byte");
                try {
                Socket socket = new Socket("ip_address", 8888);
                OutputStream out = socket.getOutputStream();
                DataOutputStream dataOutputStream = new DataOutputStream(out);
                dataOutputStream.write(bytesss);
                dataOutputStream.close();
                out.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            }

        }).start();

    }


    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

MainActivity. java

    private WifiManager wifiManager;

    String networkSSID="network";
    String networkPassword="pass123";
     int netId;

   wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); 
    networkConfiguration();


}
    private void networkConfiguration(){

        WifiConfiguration configuration=new WifiConfiguration();
        configuration.SSID="\""+networkSSID+"\""; 
        configuration.preSharedKey="\""+networkPassword+"\"";  

        wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); 

        netId=wifiManager.addNetwork(configuration); 
        wifiManager.disconnect();
        wifiManager.enableNetwork(netId,true);
        wifiManager.reconnect();
    }

    private BroadcastReceiver wifiStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
                final String action=intent.getAction();

              if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){
                if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED,false)){

                    Toast.makeText(context, "wifi connected", Toast.LENGTH_SHORT).show();
                    sendingImage();

                }else{

                    Toast.makeText(context, "Please Check Your Internet Connection", Toast.LENGTH_SHORT).show();

                }
            }

        }
    };

  @Override
    protected void onStart() { 
        super.onStart();
        networkConfiguration();
        IntentFilter intentFilter = new IntentFilter(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
        registerReceiver(wifiStateReceiver, intentFilter);
}

   @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(wifiStateReceiver);
        stopService(new Intent(this, SendImageClientService.class));
    }


    private void sendingImage() {

        drawable = (BitmapDrawable) imageView.getDrawable();
        bitmap = drawable.getBitmap();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
        byte[] array = byteArrayOutputStream.toByteArray();

        Intent serviceIntent=new Intent(this,ImageService.class);
        serviceIntent.putExtra("byte",array);
       this.startService(serviceIntent);


    }

1 Ответ

0 голосов
/ 10 апреля 2020

Это должно дать вам представление о том, как реализовать это с WorkManager. Предполагается, что this наследуется от Context (Activity, Service и др. c.). UploadWorker также может быть совершенно отдельным классом.

Я не проверял это, но теоретически это должно работать.

Вам понадобится WorkManager в качестве зависимости. Поэтому в ваш build.gradle вашего приложения вам нужно добавить его:

dependencies {
    ...

    def work_version = "2.3.4" // current version at time of answer
    // (Java only)
    implementation "androidx.work:work-runtime:$work_version"

}

А вот код java:

public void entry() {

    // Create temporary file
    // Use some kind of numbering system if you need multiple at once
    // Should use some method of cleaning up files if they never get uploaded
    File outputFile = new File(getNoBackupFilesDir(), "upload_image.jpg");


    // Save ImageView to file
    BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
    Bitmap bitmap = drawable.getBitmap();
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    try (FileOutputStream fileOutputStream = new FileOutputStream(outputFile)) {
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
    } catch (IOException e) {
        e.printStackTrace();
        return;
    }

    Data inputData = new Data.Builder()
            .putString("imagePath", outputFile.getAbsolutePath())
            .build();

    OneTimeWorkRequest uploadWork = new OneTimeWorkRequest.Builder(UploadWorker.class)
            .setConstraints(new Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.UNMETERED)
                    .build())
            .setInputData(inputData)
            .build();

    WorkManager.getInstance(this).enqueue(uploadWork);

}


public static class UploadWorker extends Worker {

    public UploadWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        String imagePath = getInputData().getString("imagePath");
        File imageFile = new File(imagePath);

        try {
            Socket socket = new Socket("ip_address", 8888);
            OutputStream out = socket.getOutputStream();
            DataOutputStream dataOutputStream = new DataOutputStream(out);
            FileInputStream fis = new FileInputStream(imageFile);
            BufferedInputStream bis = new BufferedInputStream(fis);

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = bis.read(buffer, 0, buffer.length)) != -1) {
                dataOutputStream.write(buffer, 0, bytesRead);
            }

            bis.close();
            dataOutputStream.close();
            out.close();
            socket.close();

            imageFile.delete();
        } catch (IOException e) {
            e.printStackTrace();
            return Result.failure();
        }

        return Result.success();
    }
}

Обновление: добавлено решение с временным файлом и прямая буферизация данных для поддержки загрузки больших файлов.

...