स्वीकृत INSTALL_PACKAGES अनुमति के साथ, चुपचाप ऐप्स इंस्टॉल करें


86

मैं चुपचाप सिस्टम में एपीके स्थापित करने की कोशिश कर रहा हूं। मेरा ऐप / सिस्टम / ऐप में स्थित है और सफलतापूर्वक "android.permission.INSTALL_PACKAGES" अनुमति दी गई है

हालाँकि मुझे इस अनुमति का उपयोग करने का तरीका कहीं नहीं मिल रहा है। मैंने / डेटा / ऐप में फ़ाइलों को कॉपी करने की कोशिश की और कोई सफलता नहीं मिली। इसके अलावा मैंने इस कोड का उपयोग करने की कोशिश की

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(
            Uri.parse("file:///sdcard/app.apk"),
            "application/vnd.android.package-archive");
    startActivity(intent);

लेकिन यह कोड मानक इंस्टॉलेशन डायलॉग खोलता है। मैं बिना रूट किए चुपचाप ऐप कैसे इंस्टॉल कर सकता हूं android.permission.INSTALL_PACKAGES?

PS मैं एक ऐसा ऐप लिख रहा हूं जो पहली बार शुरू होने वाले सिस्टम में फ़ोल्डर से कई एप्स स्थापित करेगा (सेटअप विज़ार्ड को बदलें)। फर्मवेयर को हल्का बनाने के लिए मुझे इसकी आवश्यकता है।

अगर आपको लगता है कि मैं एक वायरस लिख रहा हूं: सभी प्रोग्राम / डेटा / ऐप में इंस्टॉल किए जाते हैं। अनुमति Install_packages को केवल सिस्टम-सिस्टम / ऐप / सिस्टम में स्थित प्रोग्राम स्तर पर दिया जा सकता है या सिस्टम कुंजी के साथ हस्ताक्षरित किया जा सकता है। इसलिए वायरस वहां नहीं पहुंच सकता।

जैसा कि कहा गया है कि http://www.mail-archive.com/android-porting@googlegroups.com/msg06281.html ऐप्स इंस्टॉल किए जाने पर चुप हो सकते हैं यदि उनके पास install_packages की अनुमति है। इसके अलावा आपको चुपचाप नहीं संकुल को स्थापित करने के लिए Install_packages अनुमति की आवश्यकता नहीं है। साथ ही http://www.androidzoom.com/android_applications/tools/silent-installer_wgqi.html


9
@ फोसको मान लीजिए कि वह इस तरह के उपकरण को मूल उपकरण निर्माता के रूप में बना रहा है?
डैस्कैंडी

41
@ फॉस्को कौन परवाह करता है? यह एक वैध प्रश्न है जैसे डैस्कंडी वर्णन करता है। यह आमतौर पर अनुत्पादक होता है जब लोग "आप ऐसा नहीं करना चाहिए" जैसे सवालों का जवाब देते हैं। उस तरह के उत्तर से हम क्या समझ रहे हैं?
ZachM

3
अनुत्पादक की बात करें .. तो आप इस पार्टी Zach से 2 साल से थोड़ा अधिक देर से हैं, और यह सवाल मूल रूप से किए गए की तुलना में कहीं अलग दिखता है।
फोसको

2
@ फ़ॉस्को एलओएल। इसके अलावा, मैं पुष्टि कर सकता हूं कि यह अभी भी नवीनतम एंड्रॉइड ओएस में काम कर रहा है।
पोमेटू

1
@ लार्स I ने अभी-अभी F-Droid ऐप इंस्टॉल किया है: वे चुपचाप चीजें स्थापित नहीं करते हैं, वे सिर्फ Android'd पैकेज मैनेजर का संकेत देते हैं।
जोकिन इचुक

जवाबों:


60

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


विशेष रूप से, यदि आप PackageInstallerActivity और इसकी विधि को देखें onClickListener:

 public void onClick(View v) {
    if(v == mOk) {
        // Start subactivity to actually install the application
        Intent newIntent = new Intent();
        ...
        newIntent.setClass(this, InstallAppProgress.class);
        ...
        startActivity(newIntent);
        finish();
    } else if(v == mCancel) {
        // Cancel and finish
        finish();
    }
}

तब आप देखेंगे कि वास्तविक इंस्टॉलर InstallAppProgress वर्ग में स्थित है । उस वर्ग आपको लगता है कि मिल जाएगा निरीक्षण initViewकोर संस्थापक समारोह है, और अंतिम बात यह है करने के लिए कॉल है PackageManagerके installPackageसमारोह:

public void initView() {
...
pm.installPackage(mPackageURI, observer, installFlags, installerPackageName);
}

अगला कदम पैकेजमैनगर का निरीक्षण करना है , जो कि सार वर्ग है। आपको installPackage(...)वहां फंक्शन मिलेगा । बुरी खबर यह है कि यह @hide के साथ चिह्नित है। इसका मतलब है कि यह सीधे उपलब्ध नहीं है (आप इस विधि से कॉल करने में सक्षम नहीं होंगे)।

 /**
  * @hide
  * ....
  */
  public abstract void installPackage(Uri packageURI,
             IPackageInstallObserver observer, 
             int flags,String installerPackageName); 

लेकिन आप प्रतिबिंब के माध्यम से इस तरीके का उपयोग करने में सक्षम होंगे।

आप कैसे में रुचि रखते हैं PackageManagerके installPackageसमारोह लागू किया गया है, पर एक नज़र डालें PackageManagerService

सारांश

आप के माध्यम से पैकेज प्रबंधक वस्तु पाने के लिए की आवश्यकता होगी Contextकी getPackageManager()। तब आप installPackageपरावर्तन के माध्यम से कार्य करेंगे ।


2
मदद! इस तकनीक का परिणाम है: इसके कारण: java.lang.SecurityException: न तो उपयोगकर्ता 10101 और न ही वर्तमान प्रक्रिया में android.permission.INSTALL_PACKAGES है। भले ही मेरे ऐप में वह अनुमति है
gregm

13
आपका एप्लिकेशन उस अनुमति का अनुरोध करता है, लेकिन Android उस अनुमति को 3 पार्टी ऐप्स को नहीं देता है। LogCatअनुमति संबंधित लॉग के लिए देखें ।
इजारुक

@inazaruk मैंने पढ़ा कि / सिस्टम / ऐप में इंस्टॉल किए गए एप्लिकेशन इंस्टॉल_पाक का उपयोग करने के लिए स्वचालित रूप से अनुमति प्राप्त करेंगे, लेकिन जैसा कि इस पोस्ट में वर्णित है कि यह काम नहीं करता है। क्या आप मुझे कुछ संकेत दे सकते हैं?
ज़ोरब

3
मैं प्रतिबिंब के माध्यम से इंस्टॉलपैक कैसे कह सकता हूं? वास्तव में मैं विधि विधि नहीं कर सकता = aPackageManagerClass.getMethod ("installPackage", नई कक्षा [] {Uri.class, IPackageInstallObserver.class, Integer.TPE, String.class}); यह देखते हुए भी कि IPackageInstallObserver छिपा हुआ है, क्या कोई मेरी मदद कर सकता है, यहाँ प्रतिबिंब बनाने के लिए सही कोड पोस्ट कर रहा है।
शिलागह

7
जवाब में सभी लिंक मृत हैं।
मयूर गंगूरडे

13

मैंने जांच की है कि एडीबी कैसे ऐप इंस्टॉल करता है।
- यह
एपीके / डेटा / लोकल / tmp को कॉपी करता है - यह 'शेल चलाता है: pm /data/local/tmp/app.apk'

मैंने इस व्यवहार को करने की कोशिश की है: (पीसी पर, यूएसबी केबल का उपयोग करके)
adb push app.apk /sdcard/app.apk
adb shell
$ pm install /sdcard/app.apk
यह काम करता है। ऐप इंस्टॉल है।

मैंने एक एप्लिकेशन बनाया (जिसका नाम AppInstall है) जिसे दूसरे ऐप को इंस्टॉल करना चाहिए।
(सामान्य रूप से स्थापित, गैर-रूट किए गए डिवाइस)
यह करता है:
Runtime.getRuntime().exec("pm install /sdcard/app.apk").waitFor();
लेकिन यह त्रुटि देता है:
java.lang.SecurityException: Neither user 10019 nor current process has android.permission.INSTALL_PACKAGES.
ऐसा लगता है कि त्रुटि को शाम तक फेंक दिया जाता है, AppInstall द्वारा नहीं।
क्योंकि AppExstall द्वारा SecurityException को नहीं पकड़ा जाता है और ऐप क्रैश नहीं होता है।

मैंने एक रूट किए गए डिवाइस (एक ही ऐप और AppInstall) पर एक ही चीज़ की कोशिश की है और यह एक आकर्षण की तरह काम करता है।
(सामान्य रूप से स्थापित, इन / सिस्टम या कुछ भी नहीं)
AppInstall ने रूट-अनुमति भी नहीं मांगी।
लेकिन ऐसा इसलिए है क्योंकि शेल हमेशा उस उपकरण के #बजाय $होता है।

Btw, आपको रूट करने के लिए ऐप / सिस्टम को स्थापित करने की आवश्यकता है, सही है?
मैंने गैर-रूट किए गए डिवाइस पर adb रीमाउंट की कोशिश की और मिला:
remount failed: Operation not permitted.
यही कारण है कि मैं गैर-रूट किए गए डिवाइस पर / सिस्टम चीज़ को आज़मा नहीं सका।

निष्कर्ष: आपको एक रूट किए गए डिवाइस का उपयोग करना चाहिए
आशा है कि यह मदद करता है :)


मैं यह काम करने के लिए प्रतीत नहीं कर सकते। यह दिलचस्प है कि कमांड एडीबी शेल में ठीक काम करता है और तब काम नहीं करता है जब मैं इसे प्रोग्रामेटिक रूप से चलाने की कोशिश करता हूं।
शाऊल

हां, मुझे एक ही समस्या है - शेल में काम करता है, लेकिन मेरे ऐप से कॉल किए जाने पर नहीं, भले ही मैं इसे कॉल su
करूं

क्या Google डिवाइस में काम करने का कोई और तरीका है जैसे सुपर एडमिन परमिशन लेना?
रमेश कुमार

यदि आप सुपर एडमिन परमिशन चाहते हैं तो आपको चाहिए: 1) अपने डिवाइस को रूट करें, 2) सिस्टम-विभाजन पर ऐप इंस्टॉल किया गया है, 3) या ऐप को उसी कुंजी के साथ हस्ताक्षरित किया जाना चाहिए जैसे कि ओएस ही है।
फ्रेंकीएनएल

1
ऐसा इसलिए होता है क्योंकि ADB उपयोगकर्ता और आपके एप्लिकेशन के उपयोगकर्ता की अलग-अलग अनुमतियां हैं
PHPoenX

11

मैं हाल ही में उपयोगकर्ता की सहमति के बिना इंस्टॉलेशन लागू कर रहा हूं - यह एपीआई स्तर 21+ के लिए एक कियोस्क एप्लिकेशन था जहां पर्यावरण पर मेरा पूरा नियंत्रण था।

बुनियादी जरूरतें हैं

  • एपीआई स्तर 21+
  • अपडाउन को सिस्टम विशेषाधिकार प्राप्त ऐप के रूप में स्थापित करने के लिए रूट एक्सेस

निम्न विधि पढ़ता है और InputStream से APK स्थापित करता है:

public static boolean installPackage(Context context, InputStream in, String packageName)
            throws IOException {
        PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
        PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        params.setAppPackageName(packageName);
        // set params
        int sessionId = packageInstaller.createSession(params);
        PackageInstaller.Session session = packageInstaller.openSession(sessionId);
        OutputStream out = session.openWrite("COSU", 0, -1);
        byte[] buffer = new byte[65536];
        int c;
        while ((c = in.read(buffer)) != -1) {
            out.write(buffer, 0, c);
        }
        session.fsync(out);
        in.close();
        out.close();

        Intent intent = new Intent(context, MainActivity.class);
        intent.putExtra("info", "somedata");  // for extra data if needed..

        Random generator = new Random();

        PendingIntent i = PendingIntent.getActivity(context, generator.nextInt(), intent,PendingIntent.FLAG_UPDATE_CURRENT);
            session.commit(i.getIntentSender());


        return true;
    }

निम्न कोड इंस्टॉलेशन को कॉल करता है

 try {
     InputStream is = getResources().openRawResource(R.raw.someapk_source);
                    installPackage(MainActivity.this, is, "com.example.apk");
     } catch (IOException e) {
                    Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
     }

पूरी तरह से काम करने के लिए आपको सख्त INSTALL_PACKAGESअनुमति की आवश्यकता है, या उपरोक्त कोड चुपचाप विफल हो जाएगा

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

इस अनुमति को प्राप्त करने के लिए आपको अपने एपीके को सिस्टम एप्लीकेशन के रूप में इंस्टॉल करना होगा जो रूट रूट करता है (हालांकि आपके द्वारा अपने अपडेटर एप्लिकेशन को स्थापित किए जाने के बाद यह रूट के बिना काम करने लगता है)

सिस्टम एप्लिकेशन के रूप में स्थापित करने के लिए मैंने एक हस्ताक्षरित एपीके बनाया और इसके साथ धक्का दिया

adb push updater.apk /sdcard/updater.apk

और फिर इसे ले जाया गया system/priv-app- जिसके लिए एफएस की आवश्यकता होती है (यही कारण है कि रूट की आवश्यकता है)

adb shell
su
mount -o rw,remount /system
mv /sdcard/updater.apk /system/priv-app
chmod 644 /system/priv-app/updater.apk

किसी कारण से यह सरल डिबग संस्करण के साथ काम नहीं करता था, लेकिन अगर आपके आवेदन को किसी कारण से नहीं लिया जाता है तो लॉगकट उपयोगी जानकारी दिखाता priv-appहै।


"किसी कारण से यह सरल डिबग संस्करण के साथ काम नहीं कर सका" क्या आपका मतलब यह रिलीज में काम किया है, या कुछ अन्य कम "सरल" डिबग संस्करण है?
जेएम लॉर्ड

1
@JMLord यह हस्ताक्षरित रिलीज़ संस्करण के साथ काम करता है, और हस्ताक्षरित और अहस्ताक्षरित डीबग संस्करणों के साथ काम नहीं करता है - मुझे यह अजीब लगता है कि यह हस्ताक्षरित डीबग संस्करण I के साथ काम नहीं करता था लेकिन मेरे पास जांच का समय नहीं था। फिर भी सिस्टम लॉगकैट लॉग यह पता लगाने के लिए बहुत महत्वपूर्ण है कि एपीके इंस्टॉल है या नहीं।
बोरिस त्रेखोव

दरअसल, किसी कारण से, रिलीज़ के रूप में स्थापित करना INSTALL_PACKAGES की अनुमति प्राप्त करने की कुंजी थी। एप्लिकेशन निजी-एप्लिकेशन से हस्ताक्षरित डिबग में चल सकता है, लेकिन अनुमति अनुरोध अस्वीकार कर दिया गया था। आपका बहुत बहुत धन्यवाद!
जेएम लॉर्ड

@BorisTreukhov अरे क्या मैं आपके साथ जांच कर सकता हूं कि पैकेजनाम पैरामीटर क्या है? मैंने InputStream को FileInputStream में बदल दिया, लेकिन मुझे यह त्रुटि संदेश मिल रहा है: Parse /data/app/vmdl676191029.tmp/COSU में विफल

इन कमांड के बाद सिस्टम प्राइवेट ऐप कैसे इंस्टॉल करें?
user2323471

8

आपको परिभाषित करना चाहिए

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

आपके मैनिफ़ेस्ट में, फिर यदि आप सिस्टम पार्टीशन (/ सिस्टम / ऐप) में हैं या आपके पास निर्माता द्वारा हस्ताक्षरित आपका आवेदन है, तो आपके पास INSTALL_PACKAGES की अनुमति होनी चाहिए।

मेरा सुझाव 1.5 एंड्रॉइड प्रोजेक्ट के साथ एक छोटा सा एंड्रॉइड प्रोजेक्ट बनाने के लिए है, जिसका उपयोग इंस्टॉलपैकेज को प्रतिबिंब के माध्यम से कॉल करने के लिए और पैकेजों को स्थापित करने के लिए और वास्तविक तरीकों को कॉल करने के तरीकों के साथ जार निर्यात करने के लिए किया जाता है। फिर, अपनी परियोजना में जार आयात करके आप पैकेज स्थापित करने के लिए तैयार होंगे।


5

मैंने एंड्रॉइड 4.2.2 को रूट किया और यह विधि मेरे लिए काम करती है:

private void installApk(String filename) {
    File file = new File(filename); 
    if(file.exists()){
        try {   
            final String command = "pm install -r " + file.getAbsolutePath();
            Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
            proc.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
     }
}

2
सवाल रूट के बिना एप्लिकेशन इंस्टॉल करने के बारे में था, लेकिन सिस्टम "INSTALL_PACKAGES" की अनुमति के साथ। मुझे आपके उत्तर में "सु" दिखाई देता है, इसलिए इसे रूट की आवश्यकता है।
पोमटू

इस उत्तर के लिए बहुत बहुत धन्यवाद! मेरे पास समान कोड था लेकिन मैं "pm install -r" के बजाय "adb install -r" का उपयोग कर रहा था और यह मेरे लिए काम नहीं करेगा। आपने मुझे यहाँ बहुत समय बचाया है!
जेफ।

@ व्लादिमीर मुझे आपकी मदद की जरूरत है। क्या आप मुझे कुछ समय दे सकते हैं? मैं u
ट्वाना एंग

4

मुझे यह पता नहीं था कि यह कैसे करना है, क्योंकि किसी ने भी उस समय उत्तर नहीं दिया, और मुझे इस अनुमति के बारे में कोई दस्तावेज नहीं मिला। इसलिए मैंने अपना समाधान खोज लिया। यह आप ही है, लेकिन यह एक उपाय है।

मैंने बिजीबॉक्स स्थापित किया, जिसने 777 / डेटा / ऐप को अनुमति दी (मुझे सुरक्षा की परवाह नहीं है)। फिर बस ऐप से "बिजीबॉक्स इंस्टॉल" निष्पादित किया गया। यह काम करता है, लेकिन एक बड़ा सुरक्षा रिसाव है। यदि आप अनुमतियाँ 777 सेट करते हैं, तो किसी रूट की आवश्यकता नहीं है।


3
क्या आपने इस तरह कोड का उपयोग किया था? Process install; install = Runtime.getRuntime().exec("/system/bin/busybox install " + myAPK.getAbsolutePath()); int iSuccess = install.waitFor();
किसी ने

4

आप android.content.pm.IPackageInstallObserverप्रतिबिंब द्वारा छिपे हुए एपीआई का उपयोग कर सकते हैं :

public class PackageManagement {
    public static final int INSTALL_REPLACE_EXISTING = 0x00000002;
    public static final int INSTALL_SUCCEEDED = 1;

    private static Method installPackageMethod;
    private static Method deletePackageMethod;

    static {
        try {
            installPackageMethod = PackageManager.class.getMethod("installPackage", Uri.class, IPackageInstallObserver.class, Integer.TYPE, String.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public static void installPackage(PackageManager pm, Uri mPackageUri, IPackageInstallObserver observer, int installFlags, String installerPackageName) {
        try {
            installPackageMethod.invoke(pm, mPackageUri, observer, installFlags, installerPackageName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

android.content.pm.IPackageInstallObserverअपने प्रोजेक्ट में आयात करें। आपका ऐप सिस्टम होना चाहिए। आपको android.permission.INSTALL_PACKAGESअपनी मैनिफ़ेस्ट फ़ाइल में अनुमति को सक्रिय करना होगा ।


क्या आपने लॉलीपॉप और मार्शमैलो पर इस कोड का परीक्षण किया है? मेरे लिए एक भयानक दृष्टिकोण की तरह लगता है और मैं इसका इस्तेमाल करना चाहता हूं
फरहाद फगिहि

मैंने ICS से लॉलीपॉप तक का परीक्षण किया है
हरमन पोइलपेर

देखने के लिए लाइन "आपका ऐप सिस्टम होना चाहिए" है। मुझे पूरा यकीन है कि यह लॉलीपॉप पर काम करेगा या जो भी - जो कि आपका ऐप "सिस्टम" है, यानी आपके ऐप में सिस्टम अनुमतियां (मूल रूप से रूट) हैं। हालांकि उस स्थिति में, आप कमांड लाइन इंस्टॉलर का उपयोग भी कर सकते हैं।
लस्सी किन्नुनेन

1
मैं कैसे स्थापित कर रहा हूँ installPackage विधि? मतलब, मुझे उदाहरण के लिए IPackageInstallObserver कैसे मिलेगा?
फोएबस

InstallFlags का सिद्धांत क्या है?
शिवम कुमार

3

आप बस चुपचाप APK स्थापित / अपडेट करने के लिए adb install कमांड का उपयोग कर सकते हैं। नमूना कोड नीचे है

public static void InstallAPK(String filename){
    File file = new File(filename); 
    if(file.exists()){
        try {   
            String command;
            filename = StringUtil.insertEscape(filename);
            command = "adb install -r " + filename;
            Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
            proc.waitFor();
        } catch (Exception e) {
        e.printStackTrace();
        }
     }
  }

यहाँ StringUtils से क्या तात्पर्य है? क्या त्रुटि का सामना करना पड़ रहा है?
AndroidOptimist

क्षमा करें मुझे समझाया जाना चाहिए। यह स्ट्रिंग्स के लिए मेरी कस्टम क्लास है और यह तरीका यह बताता है कि रास्ता सही है। आप इसे अनदेखा कर सकते हैं
ZeeShaN AbbAs

3
स्ट्रिंग क्लास क्या है। क्या आप StringUtil.insertEscape () विधि पोस्ट कर सकते हैं? अगर मुझे लगता है कि लाइन मैं अपवाद हो रही है त्रुटि पर अमल चल रहा है ()। कमांड: [su -c, adb install -r /storage/sdcard0/Android/data/com.install.file अग्रिम धन्यवाद
sandeepmaaram

java.io.IOException: निष्पादन चलाने में त्रुटि ()। कमांड: [su -c, adb install -r /storage/emulated/0/download/SwipeAnimation.apk] कार्य निर्देशिका: अशक्त वातावरण: अशक्त - क्या आप त्रुटि समझा सकते हैं ..? और यदि प्रकट में कोई अनुमति
संदीप पी।

1
@ZeeShaNAbbAs रूट करने के बाद समस्या हल हुई .. धन्यवाद
संदीप पी।

1

शर्त:

आपके एपीके को सिस्टम द्वारा हस्ताक्षरित करने की आवश्यकता है जैसा कि पहले बताया गया है। इसे प्राप्त करने का एक तरीका एओएसपी छवि का निर्माण करना और स्रोत कोड को निर्माण में जोड़ना है।

कोड:

सिस्टम ऐप के रूप में इंस्टॉल होने के बाद, आप एपीके को स्थापित करने और अनइंस्टॉल करने के लिए पैकेज मैनेजर के तरीकों का उपयोग कर सकते हैं:

इंस्टॉल:

public boolean install(final String apkPath, final Context context) {
    Log.d(TAG, "Installing apk at " + apkPath);
    try {
        final Uri apkUri = Uri.fromFile(new File(apkPath));
        final String installerPackageName = "MyInstaller";
        context.getPackageManager().installPackage(apkUri, installObserver, PackageManager.INSTALL_REPLACE_EXISTING, installerPackageName);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

स्थापना रद्द करें:

public boolean uninstall(final String packageName, final Context context) {
    Log.d(TAG, "Uninstalling package " + packageName);
    try {
        context.getPackageManager().deletePackage(packageName, deleteObserver, PackageManager.DELETE_ALL_USERS);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

आपका एपीके इंस्टॉल होने / अनइंस्टॉल होने के बाद कॉलबैक करने के लिए आप इसका उपयोग कर सकते हैं:

/**
 * Callback after a package was installed be it success or failure.
 */
private class InstallObserver implements IPackageInstallObserver {

    @Override
    public void packageInstalled(String packageName, int returnCode) throws RemoteException {

        if (packageName != null) {
            Log.d(TAG, "Successfully installed package " + packageName);
            callback.onAppInstalled(true, packageName);
        } else {
            Log.e(TAG, "Failed to install package.");
            callback.onAppInstalled(false, null);
        }
    }

    @Override
    public IBinder asBinder() {
        return null;
    }
}

/**
 * Callback after a package was deleted be it success or failure.
 */
private class DeleteObserver implements IPackageDeleteObserver {

    @Override
    public void packageDeleted(String packageName, int returnCode) throws RemoteException {
        if (packageName != null) {
            Log.d(TAG, "Successfully uninstalled package " + packageName);
            callback.onAppUninstalled(true, packageName);
        } else {
            Log.e(TAG, "Failed to uninstall package.");
            callback.onAppUninstalled(false, null);
        }
    }

    @Override
    public IBinder asBinder() {
        return null;
    }
}

/**
 * Callback to give the flow back to the calling class.
 */
public interface InstallerCallback {
    void onAppInstalled(final boolean success, final String packageName);
    void onAppUninstalled(final boolean success, final String packageName);
}

===> एंड्रॉइड 8.1 पर परीक्षण किया गया और अच्छी तरह से काम किया।


मुझे आपकी मदद चाहिए। क्या आप मुझे कुछ समय दे सकते हैं? मैं u
ट्वाना eng

मुझे आपकी मदद चाहिए। मुझे यह जानने की आवश्यकता है कि हम अपने खुद के AOSP
ट्वाना को

0

मैंने पैकेज मैनजर.स्टॉलपैकेज पद्धति का उपयोग करते हुए, मूक इंस्टॉल के लिए एक परीक्षण ऐप बनाया।

मैं प्रतिबिंब के माध्यम से इंस्टॉलपैक विधि प्राप्त करता हूं, और अपने src फ़ोल्डर में android.content.pm.IPackageInstallObserver इंटरफ़ेस बनाया (क्योंकि यह android.content.pm पैकेज में छिपा हुआ है)।

जब मैं installPackage चलाता हूं, तो मुझे स्ट्रिंग इंडिकेशन के साथ SecurityException मिली, कि मेरे ऐप में कोई android.permission.INSTALL_PACKAGES नहीं है, लेकिन यह AndroidManifest.xml में परिभाषित किया गया है।

इसलिए, मुझे लगता है, इस पद्धति का उपयोग करना संभव नहीं है।

पुनश्च। मैंने एंड्रॉइड एसडीके 2.3 और 4.0 पर परीक्षण किया। शायद यह पहले के संस्करणों के साथ काम करेगा।


यह 4.1 और 4.0 के साथ-साथ 2.1 से अधिक (2.1 सहित) किसी भी एंड्रॉइड वर्जन में काम कर रहा है। मैं अब 4.0 एसडीके का उपयोग कर रहा हूं। आपको इसे / सिस्टम / ऐप फ़ोल्डर में जोड़ने की आवश्यकता है, अन्यथा आपके ऐप को सिस्टम-स्तर (रूट नहीं) अनुमतियों की आवश्यकता होगी। इसके अलावा, मैं इस विधि से चुपचाप ऐप्स को हटाने में सक्षम हूं, मेरे अन्य प्रश्न को हटाए जाने से संबंधित जांच करें।
पोमातु

हां, यह काम करता है, लेकिन केवल रूट की अनुमति के साथ। और बिना रूट किए डिवाइस पर ऐप को सिस्टम / ऐप में इंस्टॉल करना संभव नहीं है।
Андрей Москвичнв

रूट के साथ नहीं, बल्कि सिस्टम-स्तरीय अनुमतियों के साथ। यदि आप फर्मवेयर के निर्माता हैं, तो आप इसे / सिस्टम / ऐप में जोड़ सकते हैं। मेरे मामले में - मैं हूं (मैं फर्मवेयर के लिए अपने एप्स को जोड़ने के लिए उपकरणों के निर्माताओं से पूछता हूं)। आप चुपचाप किसी अन्य तरीके से एप्लिकेशन इंस्टॉल नहीं कर पाएंगे - अन्यथा यह एक महान सुरक्षा छेद होगा।
पोमातु

सुरक्षा छेद के बारे में - मैं आपसे पूरी तरह सहमत हूँ। और यह मेरे लिए आश्चर्य की बात होगी, अगर यह विधि किसी भी ऐप के साथ काम करती है। बिना रूट किए मैं ऐप को सिस्टम / ऐप में कैसे इंस्टॉल कर सकता हूं? मैं निर्माता नहीं हूं।
Андрей Москвичнв

1
जड़ के बिना या आप को अस्वीकार नहीं कर सकते।
पोमैतु

0

LD_LIBRARY_PATH=/vendor/lib:/system/libपीएम इंस्टाल करने से पहले इसे आजमाएं । यह अच्छा काम करता है।


0

एक 3rd पार्टी एप्लिकेशन एंड्रॉइड ऐप को धीमी गति से स्थापित नहीं कर सकता है। हालांकि, एक 3 पार्टी एप्लिकेशन एंड्रॉइड ओएस को एप्लिकेशन इंस्टॉल करने के लिए कह सकता है।

तो आपको इसे परिभाषित करना चाहिए:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file:///sdcard/app.apk", "application/vnd.android.package-archive");
startActivity(intent);

आप अनुमति देने और इस परिभाषित को अनदेखा करने के लिए इसे सिस्टम ऐप के रूप में स्थापित करने का प्रयास कर सकते हैं। (रूट आवश्यक)

रूट किए गए डिवाइस पर ऐप इंस्टॉल करने के लिए आप अपने तीसरे पक्ष के ऐप पर निम्न कमांड चला सकते हैं।

कोड है:

private void installApk(String filename) {
File file = new File(filename); 
if(file.exists()){
    try {   
        final String command = "pm install -r " + file.getAbsolutePath();
        Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
        proc.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
    }
 }
}

मुझे उम्मीद है कि यह उत्तर आपके लिए उपयोगी है।


0

एंड्रॉइड 6 और इसके बाद के संस्करण पर मूक इंस्टॉल करना संभव है। बोरिस ट्रेखोव द्वारा जवाब में दिए गए फ़ंक्शन का उपयोग करते हुए, पोस्ट में बाकी सब को अनदेखा करें, रूट की भी आवश्यकता नहीं है।

अपने एप्लिकेशन को डिवाइस व्यवस्थापक के रूप में स्थापित करें, आपके पास पृष्ठभूमि में अपडेट की मूक स्थापना के साथ पूर्ण कियोस्क मोड हो सकता है।


0

मैंने सभी उत्तरों की जांच की, निष्कर्ष यह प्रतीत होता है कि आपके पास काम करने के लिए पहले डिवाइस पर रूट एक्सेस होना चाहिए।

लेकिन तब मुझे ये लेख बहुत उपयोगी लगे। चूंकि मैं "कंपनी के स्वामित्व वाले" उपकरण बना रहा हूं।

एंड्रॉइड ऐप को बिना यूजर इंटरेक्शन के कैसे अपडेट करें

एंड्रॉइड डिवाइस ओनर - मिनिमल ऐप

यहां "प्रबंधित-डिवाइस" के बारे में Google का दस्तावेज़ है

पूरी तरह से प्रबंधित डिवाइस



-6

! / Bin / bash

f=/home/cox/myapp.apk   #or $1 if input from terminal.

#backup env var
backup=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=/vendor/lib:/system/lib
myTemp=/sdcard/temp.apk
adb push $f $myTemp
adb shell pm install -r $myTemp
#restore env var
LD_LIBRARY_PATH=$backup

यह मेरे लिए काम करता है। मैं इसे ubuntu 12.04 पर, शेल टर्मिनल पर चलाता हूं।

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