Saya tidak tahu apa artinya "loader dinamis, tergantung pada lingkungan pengguna saat ini". Jawaban yang diberikan oleh @Lie Ryan menunjukkan bagaimana Anda dapat menginstal APK yang diunduh dengan cara apa pun yang Anda pilih.
CommonsWare
Jawaban:
241
Anda dapat dengan mudah meluncurkan tautan play store atau prompt instal:
Jawaban yang bagus, tetapi jangan hardcode /sdcard, karena itu salah pada Android 2.2+ dan perangkat lain. Gunakan Environment.getExternalStorageDirectory()sebagai gantinya.
CommonsWare
3
Direktori / aset / hanya ada di mesin pengembangan Anda, ketika aplikasi dikompilasi ke APK, direktori / aset / tidak lagi ada karena semua aset zip di dalam APK. Jika Anda ingin menginstal dari / aset / direktori Anda, Anda harus mengekstraknya ke folder lain terlebih dahulu.
Lie Ryan
2
@LyanRyan. Senang melihat jawaban Anda. Saya memiliki perangkat yang telah di-rooting dengan custom ROM. Saya ingin menginstal tema secara dinamis tanpa meminta pengguna untuk menekan tombol install. Bisakah saya melakukan itu.
Sharanabasu Angadi
1
Ini tampaknya tidak berfungsi lagi ketika targetSdk adalah 25. ini memberikan pengecualian: "android.os.FileUriExposedException: ... apk terbuka di luar aplikasi melalui Intent.getData () ...". Bagaimana bisa?
pengembang android
4
@android developer: Saya tidak bisa menguji ini, saat ini, tetapi pada targetSdkVersion> = 24, yang berikut ini berlaku: stackoverflow.com/questions/38200282/... jadi Anda harus menggunakan FileProvider.
Saya memiliki masalah yang sama dan setelah beberapa upaya, berhasil bagi saya dengan cara ini. Saya tidak tahu mengapa, tetapi mengatur data dan mengetik secara terpisah mengacaukan niat saya.
Saya tidak bisa cukup menjawab jawaban ini. Untuk beberapa alasan, menetapkan data maksud dan tipe MIME secara terpisah menyebabkan ActivityNotFoundException di tingkat API 17.
Brent M. Spell
Saya baru saja memilih ini juga. Bentuk ini adalah satu-satunya yang bisa aku dapatkan untuk bekerja. Masih bertahun-tahun kemudian .. apa bug freakin ini? Jam terbuang sia-sia. Saya menggunakan Eclipse (Helios), BTW.
Tam
10
@ BrentM.Spell dan lain-lain: lihat ke dalam dokumentasi, Anda akan melihat bahwa setiap kali Anda menetapkan hanya data ATAU tipe, yang lain secara otomatis dibatalkan, misalnya: setData()akan menyebabkan parameter tipe dihapus. Anda HARUS menggunakan setDataAndType()jika Anda ingin memberikan nilai untuk keduanya. Di sini: developer.android.com/reference/android/content/…
Bogdan Alexandru
41
Solusi yang diberikan untuk pertanyaan ini berlaku untuk targetSdkVersions 23 dan di bawah. Untuk Android N, yaitu API level 24, dan di atasnya, bagaimanapun, mereka tidak bekerja dan macet dengan Pengecualian berikut:
android.os.FileUriExposedException: file:///storage/emulated/0/... exposed beyond app through Intent.getData()
Ini disebabkan oleh fakta bahwa mulai dari Android 24, Uriuntuk menangani file yang diunduh telah berubah. Misalnya, file instalasi yang bernama appName.apkdisimpan pada sistem file eksternal utama dari aplikasi dengan nama paket com.example.testakan sama
The pathNameadalah bahwa ditunjukkan pada contoh uri konten teladan di atas dan pathValuemerupakan jalan yang sebenarnya pada sistem. Ini akan menjadi ide yang bagus untuk menempatkan "." (tanpa tanda kutip) untuk pathValue di atas jika Anda tidak ingin menambahkan subdirektori tambahan.
Tulis kode berikut untuk menginstal apk dengan nama appName.apkpada sistem file eksternal utama:
Saya mengikuti metode ini. Namun, dikatakan file rusak ketika saya menekan tombol install. Saya dapat menginstal file yang sama dengan mentransfer melalui bluetooth. kenapa begitu?
HI Ketika Anda mendapatkan kesalahan file yang rusak, apa moda transportasi yang Anda berikan ke aplikasi Anda untuk membawa APK, jika Anda mengunduh dari server berarti, periksa untuk menyiram stream di file yang disalin dari server? Karena menginstal APK yang ditransfer oleh Bluetooth berfungsi berarti itu masalahnya saya kira.
Sridhar S
2
java.lang.NullPointerException: Mencoba untuk memanggil metode virtual 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData (android.content.pm.PackageManager, java.lang.String)' pada referensi objek nol
Makvin
Pustaka Anda akhirnya bisa memiliki readme sederhana dengan instruksi sederhana tentang penggunaan ...;)
Renetik
2
Terima kasih banyak, setelah satu minggu berjuang dengan jawaban ini saya menyelesaikan masalah saya! @RidharS, saya tahu ini sudah lama sekali, seperti yang saya lihat, tetapi jika Anda tertarik, pada baris 5, Anda harus menambahkan .authorityStrsetelah context.getPackageName()itu harus bekerja.
sehrob
30
Baiklah, saya menggali lebih dalam, dan menemukan sumber aplikasi PackageInstaller dari Android Source.
android.permission.INSTALL_PACKAGES hanya tersedia untuk aplikasi yang ditandatangani sistem. Jadi ini tidak akan banyak membantu
Hubert Liberacki
21
Saya hanya ingin berbagi fakta bahwa file apk saya disimpan ke direktori "Data" aplikasi saya dan bahwa saya perlu mengubah izin pada file apk agar dapat dibaca dunia agar dapat diinstal dengan cara itu, jika tidak, sistem melemparkan "Parse error: Ada Masalah Parsing Paket"; jadi gunakan solusi dari @Horaceman yang membuat:
Saya mendapatkan kesalahan parser yang sama! Saya tidak tahu bagaimana mengatasinya? Saya mengatur file.setReadable (benar, salah) tetapi tidak berfungsi untuk saya
Ketiga: Tentukan path.xml di folder res / xml seperti di bawah ini! Saya menggunakan jalur ini untuk penyimpanan internal jika Anda ingin mengubahnya ke sesuatu yang lain ada beberapa cara! Anda dapat membuka tautan ini:
FileProvider
Mengizinkan aplikasi meminta paket pemasangan. API penargetan aplikasi yang lebih dari 25 harus memiliki izin ini untuk menggunakan Intent.ACTION_INSTALL_PACKAGE.
Terima kasih, langkah keempat adalah apa yang hilang pada mereka semua.
Amin Keshavarzian
1
Memang, poin ke-4 mutlak diperlukan. Semua jawaban lain tidak terjawab sepenuhnya.
whiteagle
Tidakkah android.permission.REQUEST_INSTALL_PACKAGES hanya tersedia untuk aplikasi sistem atau aplikasi yang ditandatangani dengan keystore sistem atau apa pun?
pavi2410
@Pavitra Mengizinkan aplikasi meminta paket pemasangan. API penargetan aplikasi yang lebih dari 25 harus memiliki izin ini untuk menggunakan Intent.ACTION_INSTALL_PACKAGE. Tingkat perlindungan: tanda tangan
Hadi Note
Kode ini tidak menggunakan Intent.ACTION_INSTALL_PACKAGE. Jadi mengapa ini izin ??
Alexander Dyagilev
5
Solusi lain yang tidak perlu melakukan hard-code pada aplikasi penerima dan karenanya lebih aman:
Iya itu mungkin. Tetapi untuk itu Anda memerlukan ponsel untuk menginstal sumber yang tidak diverifikasi. Sebagai contoh, slideMe melakukan itu. Saya pikir hal terbaik yang dapat Anda lakukan adalah memeriksa apakah aplikasi tersebut ada dan mengirim maksud untuk Android Market. Anda harus menggunakan sesuatu skema url untuk Android Market.
market://details?id=package.name
Saya tidak tahu persis bagaimana memulai aktivitas tetapi jika Anda memulai aktivitas dengan url semacam itu. Itu harus membuka pasar android dan memberi Anda pilihan untuk menginstal aplikasi.
Seperti yang saya lihat, solusi ini paling dekat dengan kebenaran :). Tetapi itu tidak sesuai untuk kasus saya. Saya perlu loader dinamis, tergantung pada lingkungan pengguna saat ini, dan pergi ke pasar - bukan solusi yang baik. Tapi bagaimanapun, terima kasih.
Alkersan
4
Perlu dicatat bahwa jika Anda menggunakan DownloadManageruntuk memulai unduhan Anda, pastikan untuk menyimpannya ke lokasi eksternal misalnya setDestinationInExternalFilesDir(c, null, "<your name here>).apk";. Maksud dengan tipe paket-arsip tampaknya tidak seperti content:skema yang digunakan dengan unduhan ke lokasi internal, tetapi memang suka file:. (Mencoba untuk membungkus jalur internal menjadi objek File dan kemudian mendapatkan jalur tidak berfungsi baik, meskipun itu menghasilkan afile: url, karena aplikasi tidak akan menguraikan apk; sepertinya itu harus eksternal.)
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 menyediakan API untuk Android untuk menginstal paket APK dari dalam Aplikasi lain.
Anda bisa mendefinisikan Pembaruan Anda secara online dan mengintegrasikan API ke dalam Aplikasi Anda - hanya itu.
Saat ini API dalam keadaan Beta, tetapi Anda sudah dapat melakukan beberapa tes sendiri.
Selain itu, UpdateNode menawarkan juga menampilkan pesan melalui sistem - cukup berguna jika Anda ingin memberi tahu sesuatu yang penting bagi pengguna Anda.
Saya adalah bagian dari tim dev klien dan saya menggunakan setidaknya fungsi pesan untuk Aplikasi Android saya sendiri.
Jawaban:
Anda dapat dengan mudah meluncurkan tautan play store atau prompt instal:
atau
Namun, Anda tidak dapat menginstal .apks tanpa izin eksplisit pengguna ; tidak kecuali perangkat dan program Anda di-root.
sumber
/sdcard
, karena itu salah pada Android 2.2+ dan perangkat lain. GunakanEnvironment.getExternalStorageDirectory()
sebagai gantinya.Saya memiliki masalah yang sama dan setelah beberapa upaya, berhasil bagi saya dengan cara ini. Saya tidak tahu mengapa, tetapi mengatur data dan mengetik secara terpisah mengacaukan niat saya.
sumber
setData()
akan menyebabkan parameter tipe dihapus. Anda HARUS menggunakansetDataAndType()
jika Anda ingin memberikan nilai untuk keduanya. Di sini: developer.android.com/reference/android/content/…Solusi yang diberikan untuk pertanyaan ini berlaku untuk
targetSdkVersion
s 23 dan di bawah. Untuk Android N, yaitu API level 24, dan di atasnya, bagaimanapun, mereka tidak bekerja dan macet dengan Pengecualian berikut:Ini disebabkan oleh fakta bahwa mulai dari Android 24,
Uri
untuk menangani file yang diunduh telah berubah. Misalnya, file instalasi yang bernamaappName.apk
disimpan pada sistem file eksternal utama dari aplikasi dengan nama paketcom.example.test
akan samafile:///storage/emulated/0/Android/data/com.example.test/files/appName.apk
untuk
API 23
dan di bawah, sedangkan sesuatu sepertiuntuk
API 24
dan di atas.Rincian lebih lanjut tentang ini dapat ditemukan di sini dan saya tidak akan membahasnya.
Untuk menjawab pertanyaan untuk
targetSdkVersion
dari24
dan di atas, kita harus ikuti langkah berikut: Tambahkan berikut ke AndroidManifest.xml:2. Tambahkan
paths.xml
file berikut kexml
folder dires
dalam src, main:The
pathName
adalah bahwa ditunjukkan pada contoh uri konten teladan di atas danpathValue
merupakan jalan yang sebenarnya pada sistem. Ini akan menjadi ide yang bagus untuk menempatkan "." (tanpa tanda kutip) untuk pathValue di atas jika Anda tidak ingin menambahkan subdirektori tambahan.Tulis kode berikut untuk menginstal apk dengan nama
appName.apk
pada sistem file eksternal utama:Tidak ada izin juga diperlukan saat menulis ke direktori pribadi aplikasi Anda pada sistem file eksternal.
Saya telah menulis perpustakaan AutoUpdate di sini di mana saya telah menggunakan di atas.
sumber
.authorityStr
setelahcontext.getPackageName()
itu harus bekerja.Baiklah, saya menggali lebih dalam, dan menemukan sumber aplikasi PackageInstaller dari Android Source.
https://github.com/android/platform_packages_apps_packageinstaller
Dari manifes saya menemukan bahwa itu memerlukan izin:
Dan proses instalasi yang sebenarnya terjadi setelah konfirmasi
sumber
Saya hanya ingin berbagi fakta bahwa file apk saya disimpan ke direktori "Data" aplikasi saya dan bahwa saya perlu mengubah izin pada file apk agar dapat dibaca dunia agar dapat diinstal dengan cara itu, jika tidak, sistem melemparkan "Parse error: Ada Masalah Parsing Paket"; jadi gunakan solusi dari @Horaceman yang membuat:
sumber
Ini bisa banyak membantu orang lain!
Pertama:
Kedua: Untuk android 7 dan di atas Anda harus menentukan penyedia dalam manifes seperti di bawah ini!
Ketiga: Tentukan path.xml di folder res / xml seperti di bawah ini! Saya menggunakan jalur ini untuk penyimpanan internal jika Anda ingin mengubahnya ke sesuatu yang lain ada beberapa cara! Anda dapat membuka tautan ini: FileProvider
Keempat: Anda harus menambahkan izin ini dalam manifes:
sumber
Solusi lain yang tidak perlu melakukan hard-code pada aplikasi penerima dan karenanya lebih aman:
sumber
Iya itu mungkin. Tetapi untuk itu Anda memerlukan ponsel untuk menginstal sumber yang tidak diverifikasi. Sebagai contoh, slideMe melakukan itu. Saya pikir hal terbaik yang dapat Anda lakukan adalah memeriksa apakah aplikasi tersebut ada dan mengirim maksud untuk Android Market. Anda harus menggunakan sesuatu skema url untuk Android Market.
Saya tidak tahu persis bagaimana memulai aktivitas tetapi jika Anda memulai aktivitas dengan url semacam itu. Itu harus membuka pasar android dan memberi Anda pilihan untuk menginstal aplikasi.
sumber
Perlu dicatat bahwa jika Anda menggunakan
DownloadManager
untuk memulai unduhan Anda, pastikan untuk menyimpannya ke lokasi eksternal misalnyasetDestinationInExternalFilesDir(c, null, "<your name here>).apk";
. Maksud dengan tipe paket-arsip tampaknya tidak seperticontent:
skema yang digunakan dengan unduhan ke lokasi internal, tetapi memang sukafile:
. (Mencoba untuk membungkus jalur internal menjadi objek File dan kemudian mendapatkan jalur tidak berfungsi baik, meskipun itu menghasilkan afile:
url, karena aplikasi tidak akan menguraikan apk; sepertinya itu harus eksternal.)Contoh:
sumber
Jangan lupa untuk meminta izin:
Tambahkan AndroidManifest.xml penyedia dan izin:
Buat penyedia file XML res / xml / provider_paths.xml
Gunakan kode contoh di bawah ini:
sumber
Hanya ekstensi, jika ada yang membutuhkan perpustakaan maka ini mungkin membantu. Terima kasih untuk Raghav
sumber
coba ini
sumber
Pertama tambahkan baris berikut ke AndroidManifest.xml:
Kemudian gunakan kode berikut untuk menginstal apk:
sumber
UpdateNode menyediakan API untuk Android untuk menginstal paket APK dari dalam Aplikasi lain.
Anda bisa mendefinisikan Pembaruan Anda secara online dan mengintegrasikan API ke dalam Aplikasi Anda - hanya itu.
Saat ini API dalam keadaan Beta, tetapi Anda sudah dapat melakukan beberapa tes sendiri.
Selain itu, UpdateNode menawarkan juga menampilkan pesan melalui sistem - cukup berguna jika Anda ingin memberi tahu sesuatu yang penting bagi pengguna Anda.
Saya adalah bagian dari tim dev klien dan saya menggunakan setidaknya fungsi pesan untuk Aplikasi Android saya sendiri.
Lihat di sini deskripsi cara mengintegrasikan API
sumber
Coba ini - Tulis di Manifest:
Tulis Kode:
sumber