0

I have a special problem with some devices.

my problem is that : I am developing an app with an app widget that app and app widget must be connected to a server. app connect to server perfectly in devices but the app widget cannot connect to the server in some device.

App widget provider class :

 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);

        }
    }

Networking class:

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);
        }
    }
}

my problem is that response in some device return "error" Although the internet is connected

Ali Azimi
  • 11
  • 4

2 Answers2

0

When the phone's power mode is on, the system does not provide the necessary services to run in the background. To solve this problem, can use this code:

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);
        }
    }
Ali Azimi
  • 11
  • 4
0

Welcome to stackoverflow

Probably your problem is related to the device Android version since from Android 9 and newer traffic through HTTP from the apps in cleartext is not allowed, see here:

Android 8: Cleartext HTTP traffic not permitted

from56
  • 3,976
  • 2
  • 13
  • 23