Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 47

Скачать apk и установить

26.02.2020, 06:56. Показов 4703. Ответов 6

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня такая задача - приложение А должно обновить приложение Б. Для этого пользователь жмет кнопку в приложении А, качается ласт версия приложения Б.apk с веб сервера, запускается установка приложения Б(обновление).

Подскажите, пожалуйста, как реализовать скачивание apk файла и сразу же установить его?

Вот так я качаю apk с веб сервера:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
button_Download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                Uri uri = Uri.parse("http://ip:port/path/Б.apk");
                DownloadManager.Request request = new DownloadManager.Request(uri);
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                Long reference = downloadManager.enqueue(request);
                text_ForDownload.setText(R.string.textView_AfterDownload);
                Log.d(TAG, "Пробуем скачать");
                Toast.makeText(MainActivity.this, "Скачиваем APK файл. Проверьте шторку уведомлений!", Toast.LENGTH_LONG).show();
            }
 
        });
И вот это в манифесте:
XML
1
    <uses-permission android:name="android.permission.INTERNET" />
Оно качает, в шторке видно прогресс скачивания, но я так и не понимаю в какую директорию идет скачка. И что совсем не понимаю, как этот файл сразу же после скачивания запустить на установку?

Приложение нацелено на широкие массы дешевых аппаратов, поэтому пишу для андроида 4.4. и выше. Приложение выкладываться в маркет не будет.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.02.2020, 06:56
Ответы с готовыми решениями:

Скачать и установить apk при нажатии на кнопку
Здравствуйте, у меня вопрос как при нажатии на кнопку скачать apk файл по ссылке с сервера и установить после того как он загружен на...

Как установить apk на эмулятор?
Собственно вот...

В Intelij Idea в меню перед запуска выбивает Error:The apk for your currently selected variant (app-release.apk) is not
В Intelij Idea в меню перед запуска выбивает Error:The apk for your currently selected variant (app-release.apk) is not signed просит...

6
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 47
26.02.2020, 14:52  [ТС]
Нашел сниппет, который в случае api меньше 24 запускает по одному способу, а при 24 и более с помощью file provider.
В 1ом случае установка начинается. А вот через файл провайдер не получается. Что я делаю не так?

Код лога ошибки
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2020-02-26 18:55:02.935 30610-30610/com.example.tmupdatertest1 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.tmupdatertest1, PID: 30610
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
        at androidx.core.content.FileProvider.parsePathStrategy(FileProvider.java:605)
        at androidx.core.content.FileProvider.getPathStrategy(FileProvider.java:579)
        at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:417)
        at com.example.tmupdatertest1.MainActivity$1.onClick(MainActivity.java:43)
        at android.view.View.performClick(View.java:5610)
        at android.view.View$PerformClick.run(View.java:22265)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)



MainActivity.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.example.tmupdatertest1;
 
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
 
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
 
import java.io.File;
 
public class MainActivity extends AppCompatActivity {
 
    Button button_Install;
    private static final String TAG = "myLogs";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        button_Install = (Button) findViewById(R.id.button_Install);
 
        button_Install.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
 
 
 
                File toInstall = new File((Environment.getExternalStorageDirectory() +"/download/"), "TMDriver-NEW.apk");
                Intent intent;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    Uri apkUri = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".fileprovider", toInstall);
                    intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
                    intent.setData(apkUri);
                    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                } else {
                    Uri apkUri = Uri.fromFile(toInstall);
                    intent = new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                }
                MainActivity.this.startActivity(intent);
                
            }
        });
 
    }
}

AndroidManifest.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tmupdatertest1">
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
 
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
 
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>
 
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>

Provider_paths.xml
XML
1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_download" path="Download"/>
</paths>
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
27.02.2020, 14:21
LogaN4ik, Скопировал из рабочего проекта.
Java
1
2
3
4
5
6
7
8
9
[Kotlin]
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {             
           val apkURI = FileProvider.getUriForFile(
           context, context.applicationContext.packageName.toString() + ".provider", file
           )
           install.setDataAndType(apkURI, "application/vnd.android.package-archive")
           install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
           install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
         }
1
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 47
27.02.2020, 14:49  [ТС]
А подскажите, пожалуйста, что в таком случае писать в манифесте и xml файл провайдера?

Добавлено через 6 минут
И мне бы на яве все же, а то я в андриод деве 2ой день с нуля учу)
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
27.02.2020, 14:54
LogaN4ik, Ну во первых, не стоит использовать Environment.getExternalStorageDirectory( ).А во вторых
Цитата Сообщение от LogaN4ik Посмотреть сообщение
xml файл провайдера
Зависит от того куда вы скачиваете файл. Конкретно у меня это папка кэша приложения, соответственно в fileprovider.xml:
XML
1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <cache-path name="cache-files" path="." />
</paths>
Тут описаны варианты https://developer.android.com/... ider?hl=ru
Что касается манифеста, у вас все верно. Этого достаточно.

Добавлено через 1 минуту
Цитата Сообщение от LogaN4ik Посмотреть сообщение
а то я в андриод деве 2ой день с нуля учу)
Ну так и учите Kotlin, раз с нуля начали
0
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 47
28.02.2020, 16:24  [ТС]
Подскажите, списал код с видеоурока. На девайсе 23 и ниже загрузка файла без проблем начинается. А вот на девайсах апи 24 и выше она работает ТОЛЬКО в эмуляторах, а на реальном устройстве пишет "Не удалось загрузить файл" в шторке уведомлений. Что я делаю не так?


Котлин
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package com.example.apilevelidentifier
 
import android.Manifest
import android.app.DownloadManager
import android.content.Context
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_old__device.*
 
class New_Device : AppCompatActivity() {
 
    private val STORAGE_PERMISSION_CODE: Int = 1000
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_new__device)
 
 
        //handle button click
        downloadBtn.setOnClickListener {
            //Handle runtime permissiom for WRITE.EXTERNAL.STORAGE, if 24>=
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
                        PackageManager.PERMISSION_DENIED) {
                    //permission denied, request it
 
                    //show popup for runtime permission
                    requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), STORAGE_PERMISSION_CODE)
                }
                else{
                    //permission already granted, perform download
                    startDownloading()
                }
            }
            else{
                //system os is less than 24, runtime permisiion not required, perform download
                startDownloading()
            }
        }
 
 
    }
 
    private fun startDownloading() {
        //get text/url from text
        val url = urlEt.text.toString()
 
        //download request
        val request = DownloadManager.Request(Uri.parse(url))
        //allow type of networks to download file(s) by default both are allowed
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE)
        request.setTitle("Download")
        request.setDescription("The file is downloading..")
 
        request.allowScanningByMediaScanner()
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,"${System.currentTimeMillis()}")
 
        //get download service, and enqueue file
        val manager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
        manager.enqueue(request)
 
 
 
 
    }
 
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when(requestCode){
            STORAGE_PERMISSION_CODE -> {
                if (grantResults.isNotEmpty() && grantResults[0] ==
                    PackageManager.PERMISSION_GRANTED){
                    //permission from popup was granted, perfor download
                    startDownloading()
                }
                else{
                    //permission from popup was denied, show error message
                    Toast.makeText(this,"Permission denied!", Toast.LENGTH_LONG).show()
                }
            }
        }
    }
 
}

Манифест
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.apilevelidentifier">
 
    <!--Add permissions-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 
 
 
 
 
 
 
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".New_Device"></activity>
        <activity android:name=".level_identifier" />
        <activity android:name=".Old_Device" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
Добавлено через 30 минут
Добавил android:usesCleartextTraffic="true"
в манифест и это частично решило проблему, но опять же не на всех устрйоствах. Если на Samsung galasy s9+ с Андроид 10 качается, то на Huawei p30 lite индикатор загрузки появляется и сразу пропадает..

Добавлено через 26 минут
Update.
Теперь и на гелекси не качает.. хотя ничего не менял
0
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 47
04.03.2020, 07:43  [ТС]
update 2. Всё качает. Что было не так так и не понял) ничего не менял
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.03.2020, 07:43
Помогаю со студенческими работами здесь

Как скачать и установить Android ?
Можно ли бесплатно скачать Android ? И если да, то как это сделать ?

Нужно скачать APK
Нашел на Google Play приложение Airthings Wave. А на Xiaomi Redmi 5 GP его в упор не видит. Это как так? И как мне скачать этот APK?

Как установить .apk без файлменеджера?
Недавно отремонтировали мой Acer liquid e (android 2.2.2), теперь он немного пустоват (можно слушать музыку, звонить... всё). Самое...

Скачать и установить PHP
Здравствуйте, я хочу создать скрипт который скачает и установит PHP в зависимости скольки битная система и какая версия винды... так как я...

Как установить/скачать Halo 3 и 4 на PC?
Здравствуйте, извините может быть не там тему расположил, но у меня есть такой вопрос, как скачать файл вот отсюда удалено модератором...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru