[Android] Problem z pobieraniem

0

Witam!

Zaczynając, tworze pewną aplikacje którą nie chce wypuszczać w sklep play, co za tym idzie muszę stworzyć własny system auto updatu.
Wymyśliłem sobie tak, że zahostowałem na pewnym hostingu strone, która jedyne co ma to numer wersji, kod javy czyta to ze strony i sprawdza aktualna wersje zapisana w zmiennej, w samym kodzie.
Wszystko działa wręcz wyśmienicie, jedynym problemem jest pobranie pliku .apki z servera, próbowałem na wiele sposobów ale nic mi nie pomaga, aktualnie po kliknięciu guzika pobierz aplikacja sie crashuje
Oto cząstka mojego kodu:

String version = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_update);

    TextView tv1 = (TextView)findViewById(R.id.textView6);
    version = vh.updateNewestVersion();
    tv1.setText(version);



    addListenerOnButton();

}


public void addListenerOnButton() {

    Button button = (Button) findViewById(R.id.button);

    button.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            if(!onceClicked){
                onceClicked = true;
                Log.e("DEBUG: ","1");
                DownloadManager downloadmanager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                Log.e("DEBUG: ","2");
                Uri uri = Uri.parse("http://mojastrona/"+version+"/APKtest.apk");
                DownloadManager.Request request = new DownloadManager.Request(uri);
                request.setTitle("My File");
                request.setDescription("Downloading");
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationUri(Uri.parse("file://" + "Downloads" + "/APKtest.apk"));
                downloadmanager.enqueue(request);

            }
        }

    });
}</code>
0

Skorzystaj z gotowych rozwiązań, np Hockey App.

0

Spróbuj uri stworzyć wcześniej, z inną nazwą, np uri1;
Jeśli nie zadziała spróbuj takiego rozwiązania:

URL url = new URL("Tutaj link");
URI uri = url.toURI();
0

P.S. apka się crashuje to nic nie mówi, wymyślono jeszcze coś takiego jak debug, gdzie możesz zobaczyć jaki wyjątek poleciał. Stawiam na brak uprawnień do zapisu albo do sieci

0

Spróbuj tych wszystkich rozwiązań i daj wyniki.

0

Od początku, dziękuje za odzew.

Próbowałem wiele rozwiązań, przesiedziałem długie godziny przy tym, i jestem teraz w momencie w którym kilka spraw mi się układa.Crash z tematu był powodowany złym direm, nie wiem jakim cudem ale pominąłem wcześniej error log, sprawdzałem różne inne sposoby downloadu, nic raczej sie nie rózniły, plik mi pobiera, pokazuje informacje. Zadowolony już myślałem że to koniec problemów, niestety. Plik który sie pobiera jest o wiele mniejszy, bodajże aplikacja teraz waży 1.4 MB a plik pobrany przez aplikacje waży 600 B (?) Dodatkowo otwierając go plik nie otwiera sie jako instalator, otwiera mi się w HTML Viewer z pustą kartą. Słyszałem coś o chunkach pobierania ale nie do końca umiem je zastosować, i czy w ogóle są tu przydatne

0

Spróbuj użyć tego, by pobrać plik. Może zadziała :P :

URL strona = new URL("link razem z plikiem");
ReadableByteChannel rbc = Channels.newChannel(strona.openStream());
FileOutputStream fos = new FileOutputStream("plik");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);

Tu masz więcej do poczytania: http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html

0

Niestety, pokombinowałem z tą propozycją ale teraz nawet plik sie nie pobiera, przynajmniej tak mi sie zdaje, kod:


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_update);

        TextView tv1 = (TextView)findViewById(R.id.textView6);
        version = vh.updateNewestVersion();
        tv1.setText(version);
        PermissionHandler.verifyStoragePermissions(this);


        addListenerOnButton();

    }

    public void addListenerOnButton() {

        Button button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                if (!onceClicked) {
                    onceClicked = true;
                    downloadFileFromURL(UpdateActivity.this.getApplicationContext(),BIG_FILE);


                }
            }

        });

    }

    public static void downloadFileFromURL(Context c,String urlString) {
        try {
            File destination = new File(c.getCacheDir()+"/Nazwaapki.apk");
            URL website = new URL(urlString);
            ReadableByteChannel rbc;
            rbc = Channels.newChannel(website.openStream());
            FileOutputStream fos = new FileOutputStream(destination);
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
            fos.close();
            rbc.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Logów brak

0

Nie można korzystać z internetu na wątku głównym aplikacji (bardzo dawno temu można było, ale to inna historia). Najprostsze (i niestety nieodporne na błędy) rozwiązanie to użycie AsyncTask albo Thread.

0

Dziękuje wszystkim za rady!

Problemem nie był kod, po długich testach i debugowaniach nawet nie samego kodu, dostrzegłem że hosting na którym trzymałem instalki obcinał je przy wrzucaniu. Zakupiłem vps a on już poradził sobie bez większego problemu, temat do zamknięcia :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1