-2

I am developing app like playstore in which user can download any app. i have many apps in my application that i got from my website through wp api v2. when we click on any of the available application detail opened and it have a download link. when we click on the link it goes to the browser but what i want is when we click on any of the apps downloading link downloading should start within my app with progress bar. i didn't found any appropriate solution yet on stack or anywhere. Here is the screenshot attached for better understanding. arrow is pointing to the downloading link.

Tim
  • 41,901
  • 18
  • 127
  • 145
Shahroz javaid
  • 169
  • 1
  • 1
  • 12
  • A file download is just a request like any other. If you have an app that's already calling APIs, you can of course download files. https://futurestud.io/tutorials/retrofit-2-how-to-download-files-from-server – vlatkozelka Jul 19 '17 at 12:24
  • bro @vlatkozelka i watched it. he is putting url manually in activity. but i have the many links in my app which i have to download by clicking on that link – Shahroz javaid Jul 19 '17 at 12:29
  • That would be a totally different question, about how to pass data inside an app . – vlatkozelka Jul 19 '17 at 12:32

2 Answers2

0

you can use intent service to download the app.

Here is the code :

public class DownloadService extends IntentService {
File cacheDir;

public DownloadService() {
    super("DownloadService");
}

@Override
public void onCreate() {
    super.onCreate();
    String tmpLocation =
            Environment.getExternalStorageDirectory().getPath();
    cacheDir = new File(tmpLocation);
    if (!cacheDir.exists()) {
        cacheDir.mkdirs();
    }
}

@Override
protected void onHandleIntent(Intent intent) {
    String remoteUrl = intent.getExtras().getString("url");
    String location;
    String filename =
            remoteUrl.substring(
                    remoteUrl.lastIndexOf(File.separator) + 1);
    File tmp = new File(cacheDir.getPath()
            + File.separator + filename);
    if (tmp.exists()) {
        location = tmp.getAbsolutePath();

        stopSelf();
        return;
    }
    try {
        URL url = new URL(remoteUrl);
        HttpURLConnection httpCon =
                (HttpURLConnection) url.openConnection();
        if (httpCon.getResponseCode() != 200)
            throw new Exception("Failed to connect");
        InputStream is = httpCon.getInputStream();
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int n = 0;
        while (-1 != (n = is.read(buf))) {
            out.write(buf, 0, n);
        }
        out.close();
        is.close();
        byte[] response = out.toByteArray();
        FileOutputStream fos = new FileOutputStream(tmp);
        fos.write(response);
        fos.flush();
        fos.close();
        is.close();
        location = tmp.getAbsolutePath();
    } catch (Exception e) {
        Log.e("Service", "Failed!", e);
    }
}
}

Run this service with url passed in the intent

kanduken
  • 86
  • 1
  • 9
0

Try this code, you can put this on click of the link(textview)

  

    private static void downloadFile(String url, File outputFile) {
      try {
          URL u = new URL(url);
          URLConnection conn = u.openConnection();
          int contentLength = conn.getContentLength();

          DataInputStream stream = new DataInputStream(u.openStream());

            byte[] buffer = new byte[contentLength];
            stream.readFully(buffer);
            stream.close();

            DataOutputStream fos = new DataOutputStream(new FileOutputStream(outputFile));
            fos.write(buffer);
            fos.flush();
            fos.close();
      } catch(FileNotFoundException e) {
          return; // swallow a 404
      } catch (IOException e) {
          return; // swallow a 404
      }
    }