'This is code of image and video of instagram dowloading by link.. after downloading 4 ,5 photos or videos this code not work

This is code of image and video of instagram dowloading by link.. after downloading 4 ,5 photos or videos this code not work .and getting error findata class ..

public class FindData {

private Context context;
private GetDat getData;
String netsubType;
NetworkInfo activeNetworkInfo1;
Boolean s;

public FindData(Context context, GetDat getData) {
    this.context = context;
    this.getData = getData;
}

public void data(String stringData) {

    ArrayList<String> arrayList = new ArrayList<>();

    if (stringData.matches("https://www.instagram.com/(.*)")) {
        String[] data = stringData.split(Pattern.quote("?"));
        String string = data[0];

// if (isNetworklow()) { // // Toast.makeText(context, "network low", Toast.LENGTH_SHORT).show(); // }

        if (isNetworkAvailable()) {

            if (Method.isDownload) {
                AsyncHttpClient client = new AsyncHttpClient();
                client.get(string + "?__a=1", null, new AsyncHttpResponseHandler() {
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {

                        String res = new String(responseBody);

                        try {
                            JSONObject jsonObject = new JSONObject(res);
                            String link = null;
                            JSONObject objectGraphql = jsonObject.getJSONObject("graphql");
                            JSONObject objectMedia = objectGraphql.getJSONObject("shortcode_media");
                            boolean isVideo = objectMedia.getBoolean("is_video");
                            if (isVideo) {
                                link = objectMedia.getString("video_url");
                            } else {
                                link = objectMedia.getString("display_url");
                            }
                            arrayList.add(link);

                            try {
                                JSONObject objectSidecar = objectMedia.getJSONObject("edge_sidecar_to_children");
                                JSONArray jsonArray = objectSidecar.getJSONArray("edges");
                                arrayList.clear();
                                String edgeSidecar = null;

                                for (int i = 0; i < jsonArray.length(); i++) {

                                    JSONObject object = jsonArray.getJSONObject(i);
                                    JSONObject node = object.getJSONObject("node");
                                    boolean is_video_group = node.getBoolean("is_video");
                                    if (is_video_group) {
                                        edgeSidecar = node.getString("video_url");
                                    } else {
                                        edgeSidecar = node.getString("display_url");
                                    }
                                    arrayList.add(edgeSidecar);
                                }
                            } catch (Exception e) {
                                Log.e("error_show", e.toString());
                            }
                            getData.getData(arrayList, "", true);
                            Toast.makeText(context, "success", Toast.LENGTH_SHORT).show();



                        } catch (JSONException e) {

                            Log.e("........POOR NETWORK ........",  e.toString());
                            getData.getData(arrayList, context.getResources().getString(R.string.not_support), false);
                            Toast.makeText(context, " poor network", Toast.LENGTH_SHORT).show();

                        }
                    }
                    @Override
                    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                        Log.e("...........on failure +Tag............",error.toString());
                        Toast.makeText(context, "try again error", Toast.LENGTH_SHORT).show();
                        getData.getData(arrayList, context.getResources().getString(R.string.wrong), false);
                    }
                });
            } else {
                getData.getData(arrayList,"ff ", false);
            }
        } else {


             getData.getData(arrayList, context.getResources().getString(R.string.internet_connection), false);
           Toast.makeText(context, "no network", Toast.LENGTH_SHORT).show();
        }
    } else {
        getData.getData(arrayList, "invalid link copy again", false);
    }
}
//network check
public boolean isNetworkAvailable() {
    Log.e("TAG", "=============onFailure===============");

    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    assert connectivityManager != null;
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    //netsubType.equals( TelephonyManager.NETWORK_TYPE_EDGE)||netsubType.equals( TelephonyManager.NETWORK_TYPE_1xRTT ));
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

}

public class DownloadService extends Service {

private int position = 0;
private RemoteViews rv;
private OkHttpClient client;
private final int CHANEL_ID = 105;
private NotificationCompat.Builder builder;
private NotificationManager notificationManager;
private static final String CANCEL_TAG = "c_tag";
private final String NOTIFICATION_CHANNEL_ID = "download_service";
public static final String ACTION_START = "com.download.action.START";
public static final String ACTION_STOP = "com.download.action.STOP";

private final Handler mHandler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(@NotNull Message message) {
        int progress = Integer.parseInt(message.obj.toString());
        switch (message.what) {
            case 1:
                rv.setTextViewText(R.id.nf_title, getString(R.string.app_name));
                rv.setProgressBar(R.id.progress, 100, progress, false);
                rv.setTextViewText(R.id.nf_percentage, getResources().getString(R.string.downloading) + " " + "(" + progress + " %)");
                notificationManager.notify(CHANEL_ID, builder.build());
                break;
            case 2:
                if (Constant.downloadArray.size() - 1 != position) {
                    position++;
                    init(Constant.downloadArray.get(position));
                } else {
                 //   Toast.makeText(getApplicationContext(), getResources().getString(R.string.downloading), Toast.LENGTH_SHORT).show();
                    position = 0;
                    stopForeground(false);
                    stopSelf();
                    Events.AdapterNotify adapterNotify = new Events.AdapterNotify("");
                    GlobalBus.getBus().post(adapterNotify);
                    Method.isDownload = true;
                }
                break;
        }
        return false;
    }
});

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

@Override
public void onCreate() {
    super.onCreate();

    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
    builder.setChannelId(NOTIFICATION_CHANNEL_ID);
    builder.setSmallIcon(R.drawable.ic_baseline_notes);
    builder.setTicker(getResources().getString(R.string.downloading));
    builder.setWhen(System.currentTimeMillis());
    builder.setOnlyAlertOnce(true);

    rv = new RemoteViews(getPackageName(), R.layout.my_custom_notification);
    rv.setTextViewText(R.id.nf_title, getString(R.string.app_name));
    rv.setProgressBar(R.id.progress, 100, 0, false);
    rv.setTextViewText(R.id.nf_percentage, getResources().getString(R.string.downloading) + " " + "(0%)");

    Intent intentClose = new Intent(this, DownloadService.class);
    intentClose.setAction(ACTION_STOP);
    PendingIntent closeIntent = PendingIntent.getService(this, 0, intentClose, 0);
    rv.setOnClickPendingIntent(R.id.nf_close, closeIntent);

    builder.setCustomContentView(rv);
    NotificationChannel mChannel;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getResources().getString(R.string.app_name);// The user-visible name of the channel.
        mChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, name, NotificationManager.IMPORTANCE_HIGH);
        notificationManager.createNotificationChannel(mChannel);
    }
    startForeground(CHANEL_ID, builder.build());
}

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    try {
        if (intent.getAction() != null && intent.getAction().equals(ACTION_START)) {
            Method.isDownload = false;
            init(Constant.downloadArray.get(position));
        }
        if (intent.getAction() != null && intent.getAction().equals(ACTION_STOP)) {
            if (client != null) {
                for (Call call : client.dispatcher().runningCalls()) {
                    if (call.request().tag().equals(CANCEL_TAG))
                        call.cancel();
                }
            }
            Method.isDownload = true;
            stopForeground(false);
            stopSelf();
        }
    } catch (Exception e) {
        Log.d("error", e.toString());
        stopForeground(false);
        stopSelf();
    }
    return START_STICKY;
}


public void init(final String downloadUrl) {

    final String iconsStoragePath = Environment.getExternalStorageDirectory() + getResources().getString(R.string.download_folder_path);

    File file = new File(iconsStoragePath);
    if (!file.exists()) {
        file.mkdir();
    }

    //Using Date class
    Date date = new Date();
    //Pattern for showing milliseconds in the time "SSS"
    @SuppressLint("SimpleDateFormat")
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
    String stringDate = sdf.format(date);

    //Using Calendar class
    Calendar cal = Calendar.getInstance();
    String s = sdf.format(cal.getTime());

    final String string;

    if (downloadUrl.contains(".jpg")) {
        string = "Image-" + s + ".jpg";
    } else {
        string = "Image-" + s + ".mp4";
    }

    Log.d("file_name", string);

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

            client = new OkHttpClient();
            Request.Builder builder = new Request.Builder()
                    .url(downloadUrl)
                    .addHeader("Accept-Encoding", "identity")
                    .get()
                    .tag(CANCEL_TAG);

            Call call = client.newCall(builder.build());

            call.enqueue(new Callback() {
                @Override
                public void onFailure(@NonNull Call call, @NonNull IOException e) {
                    Log.e("TAG", "=============onFailure222===============");
                    e.printStackTrace();
                    Log.d("error_downloading", e.toString());
                    // Method.isDownload = true;
                }

                @Override
                public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                    Log.e("TAG", "=============onResponse===============");
                    Log.e("TAG", "request headers:" + response.request().headers());
                    Log.e("TAG", "response headers:" + response.headers());
                    assert response.body() != null;
                    ResponseBody responseBody = ProgressHelper.withProgress(response.body(), new ProgressUIListener() {

                        //if you don't need this method, don't override this methd. It isn't an abstract method, just an empty method.
                        @Override
                        public void onUIProgressStart(long totalBytes) {
                            super.onUIProgressStart(totalBytes);
                            Log.e("TAG", "onUIProgressStart:" + totalBytes);
                        }

                        @Override
                        public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) {
                            Log.e("TAG", "=============start===============");
                            Log.e("TAG", "numBytes:" + numBytes);
                            Log.e("TAG", "totalBytes:" + totalBytes);
                            Log.e("TAG", "percent:" + percent);
                            Log.e("TAG", "speed:" + speed);
                            Log.e("TAG", "============= end ===============");
                            Message msg = mHandler.obtainMessage();
                            msg.what = 1;
                            msg.obj = (int) (100 * percent) + "";
                            mHandler.sendMessage(msg);
                        }

                        //if you don't need this method, don't override this methd. It isn't an abstract method, just an empty method.
                        @Override
                        public void onUIProgressFinish() {
                            super.onUIProgressFinish();
                            Log.e("TAG", "onUIProgressFinish:");
                            Message msg = mHandler.obtainMessage();
                            msg.what = 2;
                            msg.obj = 0 + "";
                            mHandler.sendMessage(msg);
                            if (downloadUrl.contains(".jpg")) {
                                if (Constant.imageArray != null) {
                                    Constant.imageArray.add(0, new File(iconsStoragePath + "/" + string));
                                }
                            } else {
                                if (Constant.videoArray != null) {
                                    Constant.videoArray.add(0, new File(iconsStoragePath + "/" + string));
                                }
                            }
                            try {
                                MediaScannerConnection.scanFile(getApplicationContext(), new String[]{iconsStoragePath + "/" + string},
                                        null,
                                        (path, uri) -> {

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


                    try {

                        BufferedSource source = responseBody.source();
                        File outFile = new File(iconsStoragePath + "/" + string);
                        BufferedSink sink = Okio.buffer(Okio.sink(outFile));
                        source.readAll(sink);
                        sink.flush();
                        source.close();

                    } catch (Exception e) {
                        Log.d("show_data", e.toString());
                    }

                }
            });
        }
    }).start();
}

}

**error in FindData class2022-03-11 08:32:20.701 1631-1631/?

E/downloaderinst: Unknown bits set in runtime_flags: 0x8000 2022-03-11 08:59:02.413 1631-1631/com.pinit.downloaderinst3 E/TAG: =============onFailure=============== 2022-03-11 08:59:02.539 1631-1631/com.pinit.downloaderinst3 E/DecorView: mWindow.mActivityCurrentConfig is null 2022-03-11 08:59:03.999 1631-1631/com.pinit.downloaderinst3 E/........POOR NETWORK ........: org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject 2022-03-11 08:59:04.007 1631-1631/com.pinit.downloaderinst3 E/InputMethodManager: prepareNavigationBarInfo() rootView is null 2022-03-11 08:59:04.123 1631-1631/com.pinit.downloaderinst3 E/ViewRootImpl: sendUserActionEvent() mView returned.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source