виджет приложения не может подключиться к серверу на некоторых устройствах - PullRequest
0 голосов
/ 03 апреля 2020

У меня особая проблема с некоторыми устройствами.

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

Класс провайдера виджета приложения:

 public class WidgetOne extends AppWidgetProvider {


     @Override
     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
         super.onUpdate(context, appWidgetManager, appWidgetIds);
         ComponentName componentName = new ComponentName(context, WidgetOne.class);
         int[] allWidgetIds = appWidgetManager.getAppWidgetIds(componentName);

         for (int widgetId : allWidgetIds) {

             RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_weather);

             Intent intent = new Intent(context, WidgetOne.class);
             intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
             intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

             PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
                0, intent, PendingIntent.FLAG_UPDATE_CURRENT);


            if(!Prefe.builder().getBool("isFirstRun",true)){
                showLoading(context, remoteViews);
                new getResponseAsyncWidget1(context, remoteViews).execute();
            }


            remoteViews.setOnClickPendingIntent(R.id.root_refresh_widget, pendingIntent);
            remoteViews.setOnClickPendingIntent(R.id.img_refresh_wedget_1, pendingIntent);

            appWidgetManager.updateAppWidget(widgetId, remoteViews);

        }
    }

Класс сети:

public class Networking {
    OkHttpClient okHttpClient;

    public Networking() {
        okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(5, TimeUnit.SECONDS)
            .callTimeout(5, TimeUnit.SECONDS)
            .writeTimeout(5, TimeUnit.SECONDS)
            .readTimeout(5, TimeUnit.SECONDS)
            .retryOnConnectionFailure(false)
            .build();
    }

    public String get(String url){

       Request request = new Request.Builder()
                .url(url)
                .build();
        try {
            Response response = okHttpClient.newCall(request).execute();
            return response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
            return "error";
        }
    }

Asynctask class:

private class getResponseAsyncWidget1 extends AsyncTask<String, Integer, String> {


    String url = "//url"
    RemoteViews remoteViews;
    Context context;

    public getResponseAsyncWidget1(Context context, RemoteViews remoteViews) {
        this.context = context;
        this.remoteViews = remoteViews;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... strings) {

        Networking networking = new Networking();
        String response = networking.get(url);
        return response; // return "error" in some devices Although the internet is connected
    }

    @Override
    protected void onPostExecute(String response) {
        super.onPostExecute(response);
        if (response.matches("error")) {
            // do something
            AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, WidgetOne.class), remoteViews);
        }
            else {
            // do something
            AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, WidgetOne.class), remoteViews);
        }
    }
}

Моя проблема в том, что response в некоторых устройствах возвращает "error" Хотя inte rnet подключен

Ответы [ 2 ]

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

Добро пожаловать в stackoverflow

Возможно, ваша проблема связана с версией устройства Android, поскольку с Android 9 и более новыми трафиками c через HTTP из приложений в открытом тексте не разрешено, см. Здесь:

Android 8: HTTP-трафик в открытом тексте c не разрешен

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

Когда включен режим питания телефона, система не предоставляет необходимых служб для работы в фоновом режиме. Чтобы решить эту проблему, можно использовать этот код:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Intent intent = new Intent();
        String packageName = getPackageName();
        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        if (!pm.isIgnoringBatteryOptimizations(packageName)) {
            intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + packageName));
            startActivity(intent);
        }
    }
...