Nie wiem, co oznacza „moduł ładujący dynamiczny, zależny od bieżącego środowiska użytkownika”. Odpowiedź dostarczona przez @Lie Ryan pokazuje, jak zainstalować pakiet APK pobrany w dowolny sposób.
CommonsWare
Odpowiedzi:
240
Możesz łatwo uruchomić link do sklepu Play lub monit instalacyjny:
Dobra odpowiedź, ale nie koduj /sdcard, ponieważ jest to złe na Androidzie 2.2+ i innych urządzeniach. Użyj Environment.getExternalStorageDirectory()zamiast tego.
CommonsWare
3
Katalog / asset / istnieje tylko na komputerze dewelopera, gdy aplikacja jest kompilowana do pliku APK, katalog / asset / już nie istnieje, ponieważ wszystkie zasoby są spakowane w pliku APK. Jeśli chcesz zainstalować z katalogu / asset /, musisz najpierw wyodrębnić go do innego folderu.
Lie Ryan,
2
@LieRyan. Miło widzieć twoją odpowiedź. Mam zrootowane urządzenie z niestandardową pamięcią ROM. Chcę dynamicznie instalować motywy bez pytania użytkownika o naciśnięcie przycisku instalacji. Czy mogę to zrobić.
Sharanabasu Angadi
1
Wydaje się, że to już nie działa, gdy celSdk ma 25 lat. Daje to wyjątek: „android.os.FileUriExposedException: ... apk udostępniony poza aplikacją poprzez Intent.getData () ...”. Dlaczego?
programista Androida
4
@android developer: Obecnie nie mogę tego przetestować, ale na targetSdkVersion> = 24 obowiązują następujące zasady: stackoverflow.com/questions/38200282/... więc musisz użyć FileProvider.
Nie mogę głosować wystarczająco za odpowiedzią. Z jakiegoś powodu osobne ustawienie danych zamiaru i typu MIME powoduje wyjątek ActivityNotFoundException na poziomie API 17.
Brent M. Spell
Właśnie to podniosłem. Ta forma była jedyną cholerną formą, jaką mogłem dostać do pracy. Jeszcze lata później ... co to za dziwaczny błąd? Zmarnowane godziny. Używam Eclipse (Helios), BTW.
Tam
10
@ BrentM.Spell i inni: zajrzyj do dokumentacji, zobaczysz, że za każdym razem, gdy ustawisz tylko dane typu OR, drugi zostanie automatycznie unieważniony, np .: setData()spowoduje usunięcie parametru type. MUSISZ użyć, setDataAndType()jeśli chcesz podać wartości dla obu. Tutaj: developer.android.com/reference/android/content/…
Bogdan Alexandru
41
Rozwiązania dostarczone dla tego pytania mają zastosowanie do targetSdkVersions z 23 i poniżej. W przypadku systemu Android N, tj. Interfejsu API poziomu 24 i nowszego, nie działają one jednak i występują awarie z następującym wyjątkiem:
android.os.FileUriExposedException: file:///storage/emulated/0/... exposed beyond app through Intent.getData()
Wynika to z faktu, że począwszy od Androida 24 Urizmieniło się adresowanie pobranego pliku. Na przykład plik instalacyjny o nazwie appName.apkprzechowywany w głównym zewnętrznym systemie plików aplikacji z nazwą pakietu com.example.testbyłby taki jak
To, pathNameco pokazano w przykładowym przykładzie treści powyżej i pathValuejest rzeczywistą ścieżką w systemie. Dobrym pomysłem byłoby umieszczenie „”. (bez cudzysłowów) dla pathValue powyżej, jeśli nie chcesz dodawać żadnego dodatkowego podkatalogu.
Napisz następujący kod, aby zainstalować apk o nazwie appName.apkw podstawowym zewnętrznym systemie plików:
Zastosowałem tę metodę. Mówi jednak, że plik jest uszkodzony po naciśnięciu przycisku instalacyjnego. Jestem w stanie zainstalować ten sam plik, przesyłając przez bluetooth. dlaczego tak?
HI, gdy pojawi się błąd uszkodzenia pliku, jaki sposób transportu podałeś do swojej aplikacji, aby przynieść APK, jeśli pobierasz z serwera, sprawdź, czy opróżnić strumienie z pliku kopiowania z serwera? Ponieważ instalacja pakietu APK, który został przesłany przez działającą technologię Bluetooth, to chyba problem.
Sridhar S
2
java.lang.NullPointerException: Próba wywołania metody wirtualnej „android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData (android.content.pm.PackageManager, java.lang.String)” na odwołanie do obiektu o wartości null
Makvin
Twoja biblioteka może mieć w końcu prosty
plik
2
Dziękuję bardzo, po tygodniu zmagań z tą odpowiedzią rozwiązałem swój problem! @SridharS, wiem, że to już dawno, jak widzę, ale jeśli jesteś zainteresowany, w linii 5, powinieneś dodać .authorityStrpo context.getPackageName()tym, to powinno działać.
sehrob
30
Cóż, kopałem głębiej i znalazłem źródła aplikacji PackageInstaller ze źródła Android.
Android.permission.INSTALL_PACKAGES jest dostępny tylko dla aplikacji podpisanych przez system. Tak więc to niewiele by pomogło
Hubert Liberacki
21
Chcę tylko podzielić się faktem, że mój plik apk został zapisany w katalogu „Data” w mojej aplikacji i że muszę zmienić uprawnienia do pliku apk, aby był czytelny na całym świecie, aby umożliwić jego instalację w ten sposób, w przeciwnym razie system rzucał „Błąd analizy: Wystąpił problem podczas analizowania pakietu”; więc używając rozwiązania @Horaceman, które sprawia:
Po trzecie: Zdefiniuj path.xml w folderze res / xml jak poniżej! Używam tej ścieżki do pamięci wewnętrznej, jeśli chcesz zmienić ją na coś innego, istnieje kilka sposobów! Możesz przejść do tego linku:
FileProvider
Zezwala aplikacji na żądanie instalacji pakietów. Aplikacje kierowane na interfejsy API większe niż 25 muszą posiadać to uprawnienie, aby móc korzystać z Intent.ACTION_INSTALL_PACKAGE.
Dzięki, czwarty krok był tym, czego brakowało w nich wszystkich.
Amin Keshavarzian,
1
Rzeczywiście, czwarty punkt jest absolutnie konieczny. Wszystkie inne odpowiedzi całkowicie tego przeoczyły.
whiteagle
Czy Android.permission.REQUEST_INSTALL_PACKAGES jest dostępny tylko dla aplikacji systemowych lub aplikacji podpisanych przy użyciu systemowego magazynu kluczy lub cokolwiek innego?
pavi2410,
@Pavitra Zezwala aplikacji na żądanie instalowania pakietów. Aplikacje kierowane na interfejsy API większe niż 25 muszą posiadać to uprawnienie, aby móc korzystać z Intent.ACTION_INSTALL_PACKAGE. Poziom ochrony: podpis
Hadi Note
Ten kod nie używa zamiaru.ACTION_INSTALL_PACKAGE. Skąd więc to zezwolenie?
Alexander Dyagilev
5
Inne rozwiązanie, które nie wymaga kodowania aplikacji odbierającej na stałe, a zatem jest bezpieczniejsze:
Tak, to możliwe. Ale do tego potrzebujesz telefonu, aby zainstalować niezweryfikowane źródła. Na przykład SlideMe to robi. Myślę, że najlepszą rzeczą, jaką możesz zrobić, to sprawdzić, czy aplikacja jest obecna i wysłać zamiar dla Android Market. powinieneś użyć czegoś w schemacie URL dla Android Market.
market://details?id=package.name
Nie wiem dokładnie, jak rozpocząć działanie, ale jeśli rozpoczniesz działanie z tego rodzaju adresem URL. Powinien otworzyć rynek Android Market i dać ci możliwość zainstalowania aplikacji.
Jak widzę, to rozwiązanie jest najbliższe prawdy :). Ale to nie jest właściwe w moim przypadku. Potrzebuję dynamicznego modułu ładującego, zależnego od bieżącego środowiska użytkownika i wchodzenia na rynek - niezbyt dobre rozwiązanie. Ale i tak dziękuję.
Alkersan
4
Warto zauważyć, że jeśli używasz DownloadManagerdo rozpoczęcia pobierania, pamiętaj, aby zapisać go w zewnętrznej lokalizacji, np setDestinationInExternalFilesDir(c, null, "<your name here>).apk";. Intencja z typem pakietu archiwum nie wydaje się podobać do content:schematu używanego do pobierania do wewnętrznej lokalizacji, ale się podoba file:. (Próba zawinięcia wewnętrznej ścieżki w obiekt File, a następnie uzyskanie ścieżki również nie działa, nawet jeśli powoduje powstanie file:adresu URL, ponieważ aplikacja nie analizuje pliku APK; wygląda na to, że musi być zewnętrzna.)
String filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));String title = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length());Intent intent =newIntent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(newFile(filePath)),"application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// without this flag android returned a intent error!MainActivity.this.startActivity(intent);
UpdateNode zapewnia interfejs API dla Androida do instalowania pakietów APK z innej aplikacji.
Możesz po prostu zdefiniować swoją aktualizację online i zintegrować interfejs API z aplikacją - to wszystko.
Obecnie interfejs API jest w wersji Beta, ale możesz już samodzielnie wykonać kilka testów.
Poza tym UpdateNode oferuje również wyświetlanie komunikatów przez system - całkiem przydatne, jeśli chcesz powiedzieć coś ważnego dla swoich użytkowników.
Należę do zespołu programistów klienta i używam przynajmniej funkcji wiadomości w mojej własnej aplikacji na Androida.
Odpowiedzi:
Możesz łatwo uruchomić link do sklepu Play lub monit instalacyjny:
lub
Nie można jednak instalować plików .apks bez wyraźnej zgody użytkownika ; chyba że urządzenie i twój program są zrootowane.
źródło
/sdcard
, ponieważ jest to złe na Androidzie 2.2+ i innych urządzeniach. UżyjEnvironment.getExternalStorageDirectory()
zamiast tego.Miałem ten sam problem i po kilku próbach mi się to udało. Nie wiem dlaczego, ale osobne ustawianie danych i typów spieszyło moje zamiary.
źródło
setData()
spowoduje usunięcie parametru type. MUSISZ użyć,setDataAndType()
jeśli chcesz podać wartości dla obu. Tutaj: developer.android.com/reference/android/content/…Rozwiązania dostarczone dla tego pytania mają zastosowanie do
targetSdkVersion
s z 23 i poniżej. W przypadku systemu Android N, tj. Interfejsu API poziomu 24 i nowszego, nie działają one jednak i występują awarie z następującym wyjątkiem:Wynika to z faktu, że począwszy od Androida 24
Uri
zmieniło się adresowanie pobranego pliku. Na przykład plik instalacyjny o nazwieappName.apk
przechowywany w głównym zewnętrznym systemie plików aplikacji z nazwą pakietucom.example.test
byłby taki jakfile:///storage/emulated/0/Android/data/com.example.test/files/appName.apk
dla
API 23
i poniżej, podczas gdy coś podobnegoza
API 24
i powyżej.Więcej informacji na ten temat można znaleźć tutaj i nie zamierzam przez to przechodzić.
Aby odpowiedzieć na pytanie o
targetSdkVersion
z24
i powyżej, trzeba wykonać następujące czynności: Dodaj następujące do AndroidManifest.xml:2. Dodaj następujący
paths.xml
plik doxml
folderures
w src, main:To,
pathName
co pokazano w przykładowym przykładzie treści powyżej ipathValue
jest rzeczywistą ścieżką w systemie. Dobrym pomysłem byłoby umieszczenie „”. (bez cudzysłowów) dla pathValue powyżej, jeśli nie chcesz dodawać żadnego dodatkowego podkatalogu.Napisz następujący kod, aby zainstalować apk o nazwie
appName.apk
w podstawowym zewnętrznym systemie plików:Żadne pozwolenie nie jest również konieczne przy zapisywaniu do prywatnego katalogu własnej aplikacji w zewnętrznym systemie plików.
Napisałem tutaj bibliotekę AutoUpdate , w której użyłem powyższego.
źródło
.authorityStr
pocontext.getPackageName()
tym, to powinno działać.Cóż, kopałem głębiej i znalazłem źródła aplikacji PackageInstaller ze źródła Android.
https://github.com/android/platform_packages_apps_packageinstaller
Z manifestu stwierdziłem, że wymaga pozwolenia:
Rzeczywisty proces instalacji następuje po potwierdzeniu
źródło
Chcę tylko podzielić się faktem, że mój plik apk został zapisany w katalogu „Data” w mojej aplikacji i że muszę zmienić uprawnienia do pliku apk, aby był czytelny na całym świecie, aby umożliwić jego instalację w ten sposób, w przeciwnym razie system rzucał „Błąd analizy: Wystąpił problem podczas analizowania pakietu”; więc używając rozwiązania @Horaceman, które sprawia:
źródło
To może bardzo pomóc innym!
Pierwszy:
Po drugie: w przypadku systemu Android 7 i nowszych należy zdefiniować dostawcę w manifeście, jak poniżej!
Po trzecie: Zdefiniuj path.xml w folderze res / xml jak poniżej! Używam tej ścieżki do pamięci wewnętrznej, jeśli chcesz zmienić ją na coś innego, istnieje kilka sposobów! Możesz przejść do tego linku: FileProvider
Po czwarte: Powinieneś dodać to zezwolenie w manifeście:
źródło
Inne rozwiązanie, które nie wymaga kodowania aplikacji odbierającej na stałe, a zatem jest bezpieczniejsze:
źródło
Tak, to możliwe. Ale do tego potrzebujesz telefonu, aby zainstalować niezweryfikowane źródła. Na przykład SlideMe to robi. Myślę, że najlepszą rzeczą, jaką możesz zrobić, to sprawdzić, czy aplikacja jest obecna i wysłać zamiar dla Android Market. powinieneś użyć czegoś w schemacie URL dla Android Market.
Nie wiem dokładnie, jak rozpocząć działanie, ale jeśli rozpoczniesz działanie z tego rodzaju adresem URL. Powinien otworzyć rynek Android Market i dać ci możliwość zainstalowania aplikacji.
źródło
Warto zauważyć, że jeśli używasz
DownloadManager
do rozpoczęcia pobierania, pamiętaj, aby zapisać go w zewnętrznej lokalizacji, npsetDestinationInExternalFilesDir(c, null, "<your name here>).apk";
. Intencja z typem pakietu archiwum nie wydaje się podobać docontent:
schematu używanego do pobierania do wewnętrznej lokalizacji, ale się podobafile:
. (Próba zawinięcia wewnętrznej ścieżki w obiekt File, a następnie uzyskanie ścieżki również nie działa, nawet jeśli powoduje powstaniefile:
adresu URL, ponieważ aplikacja nie analizuje pliku APK; wygląda na to, że musi być zewnętrzna.)Przykład:
źródło
Nie zapomnij poprosić o uprawnienia:
Dodaj w AndroidManifest.xml dostawcę i pozwolenie:
Utwórz dostawcę plików XML res / xml / provider_paths.xml
Użyj poniższego przykładowego kodu:
źródło
Tylko rozszerzenie, jeśli ktoś potrzebuje biblioteki, może to pomóc. Dzięki Raghav
źródło
Spróbuj tego
źródło
Najpierw dodaj następujący wiersz do pliku AndroidManifest.xml:
Następnie użyj następującego kodu, aby zainstalować apk:
źródło
UpdateNode zapewnia interfejs API dla Androida do instalowania pakietów APK z innej aplikacji.
Możesz po prostu zdefiniować swoją aktualizację online i zintegrować interfejs API z aplikacją - to wszystko.
Obecnie interfejs API jest w wersji Beta, ale możesz już samodzielnie wykonać kilka testów.
Poza tym UpdateNode oferuje również wyświetlanie komunikatów przez system - całkiem przydatne, jeśli chcesz powiedzieć coś ważnego dla swoich użytkowników.
Należę do zespołu programistów klienta i używam przynajmniej funkcji wiadomości w mojej własnej aplikacji na Androida.
Zobacz tutaj opis integracji API
źródło
Spróbuj tego - napisz na Manifeście:
Napisz kod:
źródło