एंड्रॉइड पर एप्लिकेशन को प्रोग्रामेटिक रूप से इंस्टॉल करें


211

मुझे यह जानने में दिलचस्पी है कि क्या यह संभव है कि एक कस्टम एंड्रॉइड एप्लिकेशन से डायनामिक रूप से डाउनलोड किया गया एपीके इंस्टॉल किया जाए।


मुझे नहीं पता कि "गतिशील लोडर, वर्तमान उपयोगकर्ता पर्यावरण पर निर्भर" का अर्थ क्या है। @Lie Ryan द्वारा दिया गया उत्तर दिखाता है कि आप जो भी चुनते हैं, उसके द्वारा डाउनलोड की गई APK को कैसे स्थापित कर सकते हैं।
कॉमन्सवेयर

जवाबों:


240

आप आसानी से एक प्ले स्टोर लिंक या एक इंस्टेंट इंस्टाल लॉन्च कर सकते हैं:

Intent promptInstall = new Intent(Intent.ACTION_VIEW)
    .setDataAndType(Uri.parse("content:///path/to/your.apk"), 
                    "application/vnd.android.package-archive");
startActivity(promptInstall); 

या

Intent goToMarket = new Intent(Intent.ACTION_VIEW)
    .setData(Uri.parse("https://play.google.com/store/apps/details?id=com.package.name"));
startActivity(goToMarket);

हालाँकि, आप उपयोगकर्ता की स्पष्ट अनुमति के बिना .apks स्थापित नहीं कर सकते हैं ; जब तक डिवाइस और आपका प्रोग्राम रूट नहीं होता है।


35
अच्छा जवाब, लेकिन हार्डकोड मत करो /sdcard, क्योंकि यह एंड्रॉइड 2.2+ और अन्य उपकरणों पर गलत है। Environment.getExternalStorageDirectory()इसके बजाय उपयोग करें ।
कॉमन्सवेयर

3
/ संपत्ति / निर्देशिका केवल आपकी विकास मशीन में मौजूद होती है, जब एप्लिकेशन को एपीके में संकलित किया जाता है, / संपत्ति / निर्देशिका अब मौजूद नहीं है क्योंकि सभी परिसंपत्तियां एपीके के अंदर ज़िप की गई हैं। यदि आप अपनी / परिसंपत्ति / निर्देशिका से स्थापित करना चाहते हैं, तो आपको पहले किसी अन्य फ़ोल्डर में निकालने की आवश्यकता होगी।
रेयान

2
@ लाइरियन आपका उत्तर देखकर अच्छा लगा। मेरे पास कस्टम रॉम के साथ निहित डिवाइस है। मैं उपयोगकर्ता को इंस्टॉल बटन दबाने के लिए बिना गतिशील रूप से थीम इंस्टॉल करना चाहता हूं। क्या मै वह कर सकता हूं।
शरनाबासु अंगड़ी

1
यह तब काम नहीं करता है जब टारगेट 25 s हो जाता है। यह एक अपवाद देता है: "android.os.FileUriExposedException: ... apk Intent.getData () ..." के माध्यम से ऐप से परे उजागर होता है। कैसे?
Android डेवलपर

4
@android डेवलपर: मैं फिलहाल इसका परीक्षण नहीं कर सकता, लेकिन targetSdkVersion> = 24 पर, निम्नलिखित लागू होता है: stackoverflow.com/questions/38200282/… इसलिए आपको FileProvider का उपयोग करना होगा।
लेयान रेयान

56
File file = new File(dir, "App.apk");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
startActivity(intent);

मुझे एक ही समस्या थी और कई प्रयासों के बाद, इसने मेरे लिए इस तरह से काम किया। मुझे पता नहीं क्यों, लेकिन डेटा सेट करना और अलग से मेरे इरादे को खराब कर दिया।


मैं इस उत्तर को पर्याप्त नहीं बना सकता। किसी कारण से, आशय डेटा और MIME प्रकार को अलग-अलग सेट करना API स्तर 17 में ActivNotFoundException का कारण बनता है।
Brent M. Spell

मैंने अभी-अभी यह मतदान किया है। यह फॉर्म केवल एक ही फ्रिगिन था जिसे मैं काम कर सकता था। अभी भी साल बाद .. यह कैसा सनकी बग है? घंटों बर्बाद हुए। मैं ग्रहण (Helios), BTW का उपयोग कर रहा हूं।
तम

10
@ BrentM.Spell और अन्य: प्रलेखन में देखें, आप देखेंगे कि जब भी आप केवल डेटा या प्रकार सेट करते हैं, तो दूसरा स्वचालित रूप से शून्य हो जाता है, उदाहरण के लिए: setData()प्रकार पैरामीटर को हटा दिया जाएगा। setDataAndType()यदि आप दोनों के लिए मान देना चाहते हैं तो आप अवश्य उपयोग करें । यहाँ: developer.android.com/reference/android/content/…
बोगदान अलेक्जेंड्रू

41

इस प्रश्न के समाधान targetSdkVersion23 और नीचे के सभी पर लागू होते हैं। Android N के लिए, यानी API स्तर 24 और इसके बाद के संस्करण, हालांकि, वे निम्न अपवाद के साथ काम और दुर्घटना नहीं करते हैं:

android.os.FileUriExposedException: file:///storage/emulated/0/... exposed beyond app through Intent.getData()

यह इस तथ्य के कारण है कि एंड्रॉइड 24 से शुरू होकर, Uriडाउनलोड की गई फ़ाइल को संबोधित करने के लिए बदल गया है। उदाहरण के लिए, appName.apkपैकेज नाम के साथ ऐप की प्राथमिक बाहरी फ़ाइल सिस्टम पर संग्रहीत एक इंस्टॉलेशन फ़ाइल इस प्रकार com.example.testहोगी

file:///storage/emulated/0/Android/data/com.example.test/files/appName.apk

के लिए API 23और नीचे है, जबकि कुछ ऐसा

content://com.example.test.authorityStr/pathName/Android/data/com.example.test/files/appName.apk

के लिये API 24 और ऊपर।

इस पर अधिक जानकारी मिल सकती है यहां है और मैं इससे गुजरने वाला नहीं हूं।

के लिए प्रश्न का उत्तर देने targetSdkVersionके24 लिए और इसके बाद के संस्करण, एक निम्न चरणों का पालन करने के लिए है: AndroidManifest.xml करने के लिए निम्न करें:

<application
        android:allowBackup="true"
        android:label="@string/app_name">
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.authorityStr"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/paths"/>
        </provider>
</application>

2. निम्न paths.xmlफ़ाइल को xmlफ़ोल्डर में जोड़ेंres src, main में :

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="pathName"
        path="pathValue"/>
</paths>

pathName है कि ऊपर अनुकरणीय सामग्री उरई उदाहरण में दिखाया गया है और pathValueसिस्टम पर वास्तविक पथ है। यह एक अच्छा विचार होगा ""। (बिना उद्धरण के) ऊपर दिए गए pathValue के लिए यदि आप कोई अतिरिक्त उपनिर्देशिका नहीं जोड़ना चाहते हैं।

  1. appName.apkप्राथमिक बाहरी फाइल सिस्टम पर नाम के साथ एपीके को स्थापित करने के लिए निम्नलिखित कोड लिखें :

    File directory = context.getExternalFilesDir(null);
    File file = new File(directory, fileName);
    Uri fileUri = Uri.fromFile(file);
    if (Build.VERSION.SDK_INT >= 24) {
        fileUri = FileProvider.getUriForFile(context, context.getPackageName(),
                file);
    }
    Intent intent = new Intent(Intent.ACTION_VIEW, fileUri);
    intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
    intent.setDataAndType(fileUri, "application/vnd.android" + ".package-archive");
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    context.startActivity(intent);
    activity.finish();

बाहरी फ़ाइल सिस्टम पर अपने स्वयं के ऐप की निजी निर्देशिका में लिखते समय कोई अनुमति भी आवश्यक नहीं है।

मैंने यहाँ एक AutoUpdate लाइब्रेरी लिखी है जिसमें मैंने ऊपर प्रयोग किया है।


2
मैंने इस विधि का पालन किया। हालाँकि, यह कहता है कि जब मैं इंस्टॉल बटन दबाता हूं तो फ़ाइल दूषित हो जाती है। ब्लूटूथ के माध्यम से स्थानांतरित करके उसी फ़ाइल को स्थापित करने में सक्षम। ऐसा क्यों?

HI जब आपको फ़ाइल दूषित त्रुटि मिलती है, तो एपीके को लाने के लिए आपने अपने ऐप को परिवहन का कौन सा मोड दिया है, यदि आप सर्वर से डाउनलोड कर रहे हैं, तो सर्वर से कॉपी करने वाली फ़ाइल में स्ट्रीम को फ्लश करने के लिए देखें? एपीके को इंस्टॉल करने के बाद से जो ब्लूटूथ काम कर रहा था, इसका मतलब है कि मुझे लगता है कि समस्या है।
श्रीधर एस

2
java.lang.NullPointerException: एक अशक्त वस्तु संदर्भ पर आभासी विधि 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData (android.content.pm.PackageManager, java.lang.String)' को लागू करने का प्रयास
मैक्वीन

आपकी लाइब्रेरी उपयोग के बारे में सरल निर्देशों के साथ अंतिम सरल रीडमी में हो सकती है ...;)
रेनेटिक

2
बहुत बहुत धन्यवाद, इस जवाब के साथ एक हफ्ते के संघर्ष के बाद मैंने अपनी समस्या हल कर ली! @ श्रीधर, मुझे पता है कि यह बहुत समय पहले हो चुका है, जैसा कि मैं देख रहा हूं, लेकिन यदि आप रुचि रखते हैं, तो लाइन 5 पर, आपको इसके .authorityStrबाद context.getPackageName()काम करना चाहिए।
सेहरोब

30

खैर, मैंने गहराई से खुदाई की, और Android स्रोत से PackageInstaller एप्लिकेशन के स्रोत मिले।

https://github.com/android/platform_packages_apps_packageinstaller

प्रकट से मैंने पाया कि इसे अनुमति की आवश्यकता है:

    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />

और स्थापना की वास्तविक प्रक्रिया पुष्टि के बाद होती है

Intent newIntent = new Intent();
newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, mPkgInfo.applicationInfo);
newIntent.setData(mPackageURI);
newIntent.setClass(this, InstallAppProgress.class);
String installerPackageName = getIntent().getStringExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME);
if (installerPackageName != null) {
   newIntent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, installerPackageName);
}
startActivity(newIntent);

33
android.permission.INSTALL_PACKAGES केवल सिस्टम द्वारा हस्ताक्षरित ऐप्स के लिए उपलब्ध है। तो यह बहुत मदद नहीं करेगा
ह्यूबर्ट लिबर्टी

21

मैं सिर्फ इस तथ्य को साझा करना चाहता हूं कि मेरी एपीके फाइल मेरे ऐप "डेटा" डायरेक्टरी में सेव हो गई थी और मुझे उस तरह से इंस्टॉल करने की अनुमति देने के लिए एपीके फाइल पर अनुमतियों को बदलने के लिए दुनिया को पठनीय बनाने की जरूरत थी, अन्यथा "पार्स त्रुटि:" पैकेज को पार्स करने में समस्या है "फेंक रहा था; इसलिए @Horaceman से समाधान का उपयोग करता है:

File file = new File(dir, "App.apk");
file.setReadable(true, false);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
startActivity(intent);

मुझे वही पार्सर त्रुटि हो रही है! मैं नहीं जानता कि इसे कैसे हल किया जाए? मैंने file.setReadable (सही, गलत) सेट किया है, लेकिन यह मेरे लिए काम नहीं कर रहा है
Jai

15

यह दूसरों की बहुत मदद कर सकता है!

प्रथम:

private static final String APP_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyAppFolderInStorage/";

private void install() {
    File file = new File(APP_DIR + fileName);

    if (file.exists()) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        String type = "application/vnd.android.package-archive";

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Uri downloadedApk = FileProvider.getUriForFile(getContext(), "ir.greencode", file);
            intent.setDataAndType(downloadedApk, type);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        } else {
            intent.setDataAndType(Uri.fromFile(file), type);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }

        getContext().startActivity(intent);
    } else {
        Toast.makeText(getContext(), "ّFile not found!", Toast.LENGTH_SHORT).show();
    }
}

दूसरा: एंड्रॉइड 7 और इसके बाद के संस्करण के लिए आपको नीचे की तरह एक प्रदाता को परिभाषित करना चाहिए!

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="ir.greencode"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/paths" />
    </provider>

तीसरा: Res / xml फ़ोल्डर में path.xml को नीचे की तरह परिभाषित करें! मैं आंतरिक भंडारण के लिए इस पथ का उपयोग कर रहा हूँ यदि आप इसे किसी और चीज़ में बदलना चाहते हैं तो कुछ तरीका है! आप इस लिंक पर जा सकते हैं: FileProvider

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="your_folder_name" path="MyAppFolderInStorage/"/>
</paths>

फोर्थ: आपको इस अनुमति को प्रकट में जोड़ना चाहिए:

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

एप्लिकेशन को पैकेज स्थापित करने का अनुरोध करने देता है। 25 से अधिक API को लक्षित करने वाले ऐप्स को Intent.ACTION_INSTALL_PACKAGE का उपयोग करने के लिए यह अनुमति होनी चाहिए।

कृपया सुनिश्चित करें कि प्रदाता प्राधिकरण समान हैं!



3
धन्यवाद, चौथा चरण उन सभी में गायब था।
अमीन केशवार्जियन

1
वास्तव में, 4 वां बिंदु बिल्कुल आवश्यक है। अन्य सभी उत्तरों ने इसे पूरी तरह से याद किया।
वाइटअगल

क्या android.permission.REQUEST_INSTALL_PACKAGES केवल सिस्टम एप्स या एप्स के लिए उपलब्ध नहीं है जो सिस्टम की -स्टोर के साथ साइन किया गया है या जो भी हो?
pavi2410

@Pavitra किसी एप्लिकेशन को पैकेजों को स्थापित करने का अनुरोध करने देता है। 25 से अधिक API को लक्षित करने वाले ऐप्स को Intent.ACTION_INSTALL_PACKAGE का उपयोग करने के लिए यह अनुमति होनी चाहिए। संरक्षण का स्तर: हस्ताक्षर
हादी नोट

यह कोड Intent.ACTION_INSTALL_PACKAGE का उपयोग नहीं करता है। तो यह अनुमति क्यों ??
अलेक्जेंडर डियागिलेव

5

एक अन्य समाधान जिसे प्राप्त करने वाले ऐप को हार्ड-कोड करने की आवश्यकता नहीं है और इसलिए यह अधिक सुरक्षित है:

Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setData( Uri.fromFile(new File(pathToApk)) );
startActivity(intent);

4

हाँ, यह मुमकिन है। लेकिन इसके लिए आपको असत्यापित स्रोतों को स्थापित करने के लिए फोन की आवश्यकता होगी। उदाहरण के लिए, SlideMe ऐसा करता है। मुझे लगता है कि सबसे अच्छी बात यह है कि आप यह देख सकते हैं कि क्या एप्लिकेशन मौजूद है और एंड्रॉइड मार्केट के लिए एक इरादा भेजें। आपको Android Market के लिए कुछ url योजना का उपयोग करना चाहिए।

market://details?id=package.name

मुझे ठीक से पता नहीं है कि गतिविधि कैसे शुरू की जाए, लेकिन यदि आप उस तरह के यूआरएल के साथ गतिविधि शुरू करते हैं। इसे एंड्रॉइड मार्केट खोलना चाहिए और आपको ऐप्स इंस्टॉल करने का विकल्प देना चाहिए।


जैसा कि मैंने देखा, यह समाधान सच्चाई के सबसे करीब है :)। लेकिन यह मेरे मामले के लिए उपयुक्त नहीं है। मुझे गतिशील लोडर की आवश्यकता है, जो वर्तमान उपयोगकर्ता वातावरण पर निर्भर है, और बाजार में जा रहा है - एक अच्छा समाधान नहीं। लेकिन फिर भी, धन्यवाद।
अलकनसान

4

यह ध्यान देने योग्य है कि यदि आप DownloadManagerअपने डाउनलोड को बंद करने के लिए उपयोग करते हैं , तो इसे किसी बाहरी स्थान पर सहेजना सुनिश्चित करें जैसे setDestinationInExternalFilesDir(c, null, "<your name here>).apk";। पैकेज-आर्काइव प्रकार के साथ आशय content:आंतरिक स्थान पर डाउनलोड के साथ उपयोग की जाने वाली योजना को पसंद नहीं करता है , लेकिन पसंद करता है file:। (आंतरिक पथ को फ़ाइल ऑब्जेक्ट में लपेटने का प्रयास करना और फिर पथ प्राप्त करना या तो काम नहीं करता है, भले ही यह एक परिणाम के रूप में होfile: यूआरएल , क्योंकि ऐप एपीके को पार्स नहीं करेगा; ऐसा लगता है कि यह बाहरी होना चाहिए।)

उदाहरण:

int uriIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);
String downloadedPackageUriString = cursor.getString(uriIndex);
File mFile = new File(Uri.parse(downloadedPackageUriString).getPath());
Intent promptInstall = new Intent(Intent.ACTION_VIEW)
        .setDataAndType(Uri.fromFile(mFile), "application/vnd.android.package-archive")
        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
appContext.startActivity(promptInstall);

3

अनुमति का अनुरोध करने के लिए मत भूलना:

android.Manifest.permission.WRITE_EXTERNAL_STORAGE 
android.Manifest.permission.READ_EXTERNAL_STORAGE

प्रदाता और अनुमति में AndroidManifest.xml जोड़ें:

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
...
<application>
    ...
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>
</application>

XML फ़ाइल प्रदाता res / xml / provider_paths.xml बनाएँ

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="external"
        path="." />
    <external-files-path
        name="external_files"
        path="." />
    <cache-path
        name="cache"
        path="." />
    <external-cache-path
        name="external_cache"
        path="." />
    <files-path
        name="files"
        path="." />
</paths>

नीचे दिए गए उदाहरण कोड का उपयोग करें:

   public class InstallManagerApk extends AppCompatActivity {

    static final String NAME_APK_FILE = "some.apk";
    public static final int REQUEST_INSTALL = 0;

     @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // required permission:
        // android.Manifest.permission.WRITE_EXTERNAL_STORAGE 
        // android.Manifest.permission.READ_EXTERNAL_STORAGE

        installApk();

    }

    ...

    /**
     * Install APK File
     */
    private void installApk() {

        try {

            File filePath = Environment.getExternalStorageDirectory();// path to file apk
            File file = new File(filePath, LoadManagerApkFile.NAME_APK_FILE);

            Uri uri = getApkUri( file.getPath() ); // get Uri for  each SDK Android

            Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
            intent.setData( uri );
            intent.setFlags( Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK );
            intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
            intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
            intent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, getApplicationInfo().packageName);

            if ( getPackageManager().queryIntentActivities(intent, 0 ) != null ) {// checked on start Activity

                startActivityForResult(intent, REQUEST_INSTALL);

            } else {
                throw new Exception("don`t start Activity.");
            }

        } catch ( Exception e ) {

            Log.i(TAG + ":InstallApk", "Failed installl APK file", e);
            Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG)
                .show();

        }

    }

    /**
     * Returns a Uri pointing to the APK to install.
     */
    private Uri getApkUri(String path) {

        // Before N, a MODE_WORLD_READABLE file could be passed via the ACTION_INSTALL_PACKAGE
        // Intent. Since N, MODE_WORLD_READABLE files are forbidden, and a FileProvider is
        // recommended.
        boolean useFileProvider = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;

        String tempFilename = "tmp.apk";
        byte[] buffer = new byte[16384];
        int fileMode = useFileProvider ? Context.MODE_PRIVATE : Context.MODE_WORLD_READABLE;
        try (InputStream is = new FileInputStream(new File(path));
             FileOutputStream fout = openFileOutput(tempFilename, fileMode)) {

            int n;
            while ((n = is.read(buffer)) >= 0) {
                fout.write(buffer, 0, n);
            }

        } catch (IOException e) {
            Log.i(TAG + ":getApkUri", "Failed to write temporary APK file", e);
        }

        if (useFileProvider) {

            File toInstall = new File(this.getFilesDir(), tempFilename);
            return FileProvider.getUriForFile(this,  BuildConfig.APPLICATION_ID, toInstall);

        } else {

            return Uri.fromFile(getFileStreamPath(tempFilename));

        }

    }

    /**
     * Listener event on installation APK file
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == REQUEST_INSTALL) {

            if (resultCode == Activity.RESULT_OK) {
                Toast.makeText(this,"Install succeeded!", Toast.LENGTH_SHORT).show();
            } else if (resultCode == Activity.RESULT_CANCELED) {
                Toast.makeText(this,"Install canceled!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this,"Install Failed!", Toast.LENGTH_SHORT).show();
            }

        }

    }

    ...

}

2

बस एक विस्तार, अगर किसी को पुस्तकालय की आवश्यकता है तो यह मदद कर सकता है। राघव को धन्यवाद


2

इसे इस्तेमाल करे

String filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
String title = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length() );
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(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);

1

सबसे पहले AndroidManifest.xml में निम्न पंक्ति जोड़ें:

<uses-permission android:name="android.permission.INSTALL_PACKAGES"
    tools:ignore="ProtectedPermissions" />

फिर APK स्थापित करने के लिए निम्न कोड का उपयोग करें:

File sdCard = Environment.getExternalStorageDirectory();
            String fileStr = sdCard.getAbsolutePath() + "/MyApp";// + "app-release.apk";
            File file = new File(fileStr, "TaghvimShamsi.apk");
            Intent promptInstall = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(file),
                    "application/vnd.android.package-archive");
            startActivity(promptInstall);

0

अपडेटनोड एंड्रॉइड के लिए एपीपी को दूसरे ऐप के अंदर से इंस्टॉल करने के लिए एक एपीआई प्रदान करता है।

आप बस अपने अपडेट को ऑनलाइन परिभाषित कर सकते हैं और एपीआई को अपने ऐप में एकीकृत कर सकते हैं - बस।
वर्तमान में एपीआई बीटा स्थिति में है, लेकिन आप पहले से ही कुछ परीक्षण स्वयं कर सकते हैं।

इसके अलावा, अपडेटनोड संदेश भी प्रदर्शित करता है, हालांकि सिस्टम - बहुत उपयोगी है यदि आप अपने उपयोगकर्ताओं को कुछ महत्वपूर्ण बताना चाहते हैं।

मैं क्लाइंट देव टीम का हिस्सा हूं और अपने एंड्रॉइड ऐप के लिए कम से कम मैसेज की कार्यक्षमता का उपयोग कर रहा हूं।

यहां देखें कि एपीआई को कैसे एकीकृत किया जाए


वेबसाइट के साथ कुछ समस्याएं हैं। मुझे api_key नहीं मिल रहा है और मैं पंजीकरण जारी नहीं रख सकता।
infinite_loop_

हाय @infinite_loop_ आप अपने उपयोगकर्ता खाते के अनुभाग में एपीआई कुंजी पा सकते हैं: updatenode.com/profile/view_keys
साराहारा

0

इसे आज़माएं - मैनिफेस्ट पर लिखें:

uses-permission android:name="android.permission.INSTALL_PACKAGES"
        tools:ignore="ProtectedPermissions"

कोड लिखें:

File sdCard = Environment.getExternalStorageDirectory();
String fileStr = sdCard.getAbsolutePath() + "/Download";// + "app-release.apk";
File file = new File(fileStr, "app-release.apk");
Intent promptInstall = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(file),
                        "application/vnd.android.package-archive");

startActivity(promptInstall);

1
आप पैकेज इंस्टालर गतिविधि शुरू करने के लिए कि प्रणाली केवल अनुमति की जरूरत नहीं है
Clocker
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.