প্রোগ্রামিকভাবে APK গুলি ইনস্টল / আনইনস্টল করুন (প্যাকেজম্যানেজার বনাম ইন্টেন্টস)


141

আমার অ্যাপ্লিকেশনটি অন্যান্য অ্যাপ্লিকেশনগুলি ইনস্টল করে এবং এটি কী অ্যাপ্লিকেশনগুলি ইনস্টল করেছে তা ট্র্যাক করা দরকার। অবশ্যই, কেবল ইনস্টল করা অ্যাপ্লিকেশনগুলির একটি তালিকা রেখে এটি অর্জন করা যেতে পারে। তবে এটি প্রয়োজন হবে না! ইনস্টলডবাই (ক, খ) সম্পর্ক বজায় রাখা প্যাকেজম্যানেজারের দায়িত্ব হওয়া উচিত। আসলে, এপিআই অনুসারে এটি হ'ল:

পাবলিক অ্যাবস্ট্রাক্ট স্ট্রিং getInstallerPackageName (স্ট্রিং প্যাকেজনাম) - অ্যাপ্লিকেশনটির প্যাকেজের নামটি প্যাকেজ ইনস্টল করে। এটি প্যাকেজটি কোন বাজার থেকে এসেছে তা সনাক্ত করে।

বর্তমান পদ্ধতির

ইন্টেন্ট ব্যবহার করে APK ইনস্টল করুন

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);

অভিপ্রায় ব্যবহার করে APK আনইনস্টল করুন:

Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package",
getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packageName,null));
startActivity(intent);

এটি সম্ভবত উপায় নয় যেমন অ্যান্ড্রয়েড মার্কেট প্যাকেজগুলি ইনস্টল / আনইনস্টল করে। তারা প্যাকেজম্যানেজারের আরও উন্নত সংস্করণ ব্যবহার করে। এটি অ্যান্ড্রয়েড গিট সংগ্রহস্থল থেকে অ্যান্ড্রয়েড উত্স কোড ডাউনলোড করে দেখা যায়। নীচে দুটি গোপন পদ্ধতি যা ইনটেন্ট পদ্ধতির সাথে মিলে যায়। দুর্ভাগ্যক্রমে তারা বাহ্যিক বিকাশকারীদের কাছে উপলব্ধ নয়। তবে সম্ভবত তারা ভবিষ্যতে হবে?

আরও ভাল পদ্ধতির

প্যাকেজম্যানেজারটি ব্যবহার করে APK ইনস্টল করা হচ্ছে

/**
 * @hide
 * 
 * Install a package. Since this may take a little while, the result will
 * be posted back to the given observer.  An installation will fail if the calling context
 * lacks the {@link android.Manifest.permission#INSTALL_PACKAGES} permission, if the
 * package named in the package file's manifest is already installed, or if there's no space
 * available on the device.
 *
 * @param packageURI The location of the package file to install.  This can be a 'file:' or a
 * 'content:' URI.
 * @param observer An observer callback to get notified when the package installation is
 * complete. {@link IPackageInstallObserver#packageInstalled(String, int)} will be
 * called when that happens.  observer may be null to indicate that no callback is desired.
 * @param flags - possible values: {@link #INSTALL_FORWARD_LOCK},
 * {@link #INSTALL_REPLACE_EXISTING}, {@link #INSTALL_ALLOW_TEST}.
 * @param installerPackageName Optional package name of the application that is performing the
 * installation. This identifies which market the package came from.
 */
public abstract void installPackage(
        Uri packageURI, IPackageInstallObserver observer, int flags,
        String installerPackageName);

প্যাকেজম্যানেজারটি ব্যবহার করে APK আনইনস্টল করা

/**
 * Attempts to delete a package.  Since this may take a little while, the result will
 * be posted back to the given observer.  A deletion will fail if the calling context
 * lacks the {@link android.Manifest.permission#DELETE_PACKAGES} permission, if the
 * named package cannot be found, or if the named package is a "system package".
 * (TODO: include pointer to documentation on "system packages")
 *
 * @param packageName The name of the package to delete
 * @param observer An observer callback to get notified when the package deletion is
 * complete. {@link android.content.pm.IPackageDeleteObserver#packageDeleted(boolean)} will be
 * called when that happens.  observer may be null to indicate that no callback is desired.
 * @param flags - possible values: {@link #DONT_DELETE_DATA}
 *
 * @hide
 */
public abstract void deletePackage(
        String packageName, IPackageDeleteObserver observer, int flags);

পার্থক্য

  • অভিপ্রায়গুলি ব্যবহার করার সময় স্থানীয় প্যাকেজ ম্যানেজারটি কোন অ্যাপ্লিকেশনটি ইনস্টলেশন থেকে উদ্ভূত তা সম্পর্কে সচেতন হয় না। বিশেষত, getInstallerPackageName (...) শূন্য ফিরে আসে।

  • লুকানো পদ্ধতি ইনস্টলপ্যাকেজ (...) ইনস্টলার প্যাকেজের নামটিকে প্যারামিটার হিসাবে গ্রহণ করে এবং সম্ভবত এই মানটি সেট করতে সক্ষম।

প্রশ্ন

ইন্টেন্ট ব্যবহার করে প্যাকেজ ইনস্টলারটির নাম নির্দিষ্ট করা সম্ভব? (সম্ভবত ইনস্টলেশন প্যাকেজের নামটি ইনস্টলেশন অভিযানের অতিরিক্ত হিসাবে যুক্ত করা যেতে পারে?)

টিপ: আপনি অ্যান্ড্রয়েড উত্স কোডটি ডাউনলোড করতে চাইলে আপনি এখানে বর্ণিত পদক্ষেপগুলি অনুসরণ করতে পারেন: উত্স গাছটি ডাউনলোড করা। *। জাভা ফাইলগুলি বের করে আনার জন্য এবং প্যাকেজ শ্রেণিবিন্যাস অনুসারে ফোল্ডারে রাখার জন্য আপনি এই ঝরঝরে স্ক্রিপ্টটি পরীক্ষা করে দেখতে পারেন: Eclipse এ অ্যান্ড্রয়েড উত্স কোড দেখুন


পাঠ্যটিতে কিছু ইউআরআই অনুপস্থিত। আমি অনুমতি পাওয়ার সাথে সাথে এগুলি যুক্ত করব (নতুন ব্যবহারকারীদের স্প্যাম প্রতিরোধে কিছু বিধিনিষেধ রয়েছে)।
হাভার্ড গিথাস

1
আনইনস্টল কার্যকারিতা কীভাবে অক্ষম করবেন?

2
@ ব্যবহারকারী938893: "আনইনস্টল কার্যকারিতা কীভাবে অক্ষম করবেন?" - কিছু হার্ড-টু-আনইনস্টল ম্যালওয়্যার নিয়ে কাজ করা, আমরা কি?
ড্যানিয়েল

উত্তর:


66

এটি বর্তমানে তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলিতে উপলভ্য নয়। নোট করুন যে এমনকি ইনস্টলপ্যাকেজ () ইনস্টল করার জন্য প্রতিচ্ছবি বা অন্যান্য কৌশল ব্যবহার করাও সহায়তা করবে না, কারণ কেবল সিস্টেম অ্যাপ্লিকেশনই এটি ব্যবহার করতে পারে। (এটি কারণ এটি নিম্ন-স্তরের ইনস্টল মেকানিজম, ব্যবহারকারী দ্বারা অনুমতি অনুমোদনের পরে, তাই নিয়মিত অ্যাপ্লিকেশনগুলিতে অ্যাক্সেস থাকা নিরাপদ নয়))

এছাড়াও ইনস্টলপ্যাকেজ () ফাংশন আর্গুমেন্টগুলি প্রায়শই প্ল্যাটফর্মের রিলিজের মধ্যে পরিবর্তিত হয়, তাই আপনি অ্যাক্সেস করার চেষ্টা করে যা কিছু করেন তা প্ল্যাটফর্মের অন্যান্য বিভিন্ন সংস্করণে ব্যর্থ হবে।

সম্পাদনা করুন:

এছাড়াও এটি উল্লেখ করার মতো যে এই ইনস্টলারপ্যাকেজটি সম্প্রতি প্ল্যাটফর্মটিতে মোটামুটি যুক্ত হয়েছিল (২.২?) এবং আসলে অ্যাপটি কে ইনস্টল করেছে তা ট্র্যাকিংয়ের জন্য ব্যবহার করা হয়নি - এটি বাগের সাথে প্রতিবেদন করার সময় কে লঞ্চ করতে হবে তা নির্ধারণ করার জন্য প্ল্যাটফর্ম ব্যবহার করে অ্যাপ্লিকেশনটি, অ্যান্ড্রয়েড প্রতিক্রিয়া প্রয়োগের জন্য। (এটিও এপিআই পদ্ধতির যুক্তিগুলির পরিবর্তনের সময়গুলির মধ্যে একটি ছিল)) এটি চালু হওয়ার কমপক্ষে দীর্ঘ সময় পরেও মার্কেট এটি ইনস্টল করা অ্যাপগুলিকে ট্র্যাক করতে ব্যবহার করে নি (এবং এটি সম্ভবত এখনও এটি ব্যবহার না করে) ), তবে পরিবর্তে প্রতিক্রিয়ার যত্ন নেওয়ার জন্য "মালিক" হিসাবে অ্যান্ড্রয়েড প্রতিক্রিয়া অ্যাপ্লিকেশনটিকে (যা বাজার থেকে পৃথক ছিল) সেট করতে কেবল এটি ব্যবহার করেছিল।


"মনে রাখবেন যে ইনস্টলপ্যাকেজ () ব্যবহার করার জন্য প্রতিবিম্ব বা অন্যান্য কৌশল ব্যবহার করাও সহায়তা করবে না, কারণ কেবল সিস্টেম অ্যাপ্লিকেশনই এটি ব্যবহার করতে পারে।" ধরুন আমি নেটিভ অ্যান্ড্রয়েড ছাড়া অন্য কোনও প্ল্যাটফর্মের জন্য একটি প্যাকেজ ইনস্টল / মুছে ফেল / পরিচালনা করব। কীভাবে আমার ইনস্টল / অপসারণ অ্যাক্সেস করা উচিত?
দাদাকান্দি

যথাযথভাবে গঠিত ইন্টেন্ট সহ স্টার্টঅ্যাক্টিভিটি ()। (আমি নিশ্চিত স্ট্যাকওভারফ্লোতে অন্য কোথাও এর জবাব দেওয়া হয়েছে, সুতরাং কিছু ভুল হওয়ার ঝুঁকিতে আমি এখানে যথাযথ উত্তর দেওয়ার চেষ্টা করব না।)
হ্যাকবড

মিম্মেকে, এটি স্ট্যান্ডার্ড অ্যান্ড্রয়েড ইনস্টল / সরান ডায়ালগগুলি নিয়ে আসে। এই বিবরণগুলি ইতিমধ্যে পরিচালনা করা হয়েছে - আমি "ঠিক **** এই প্যাকেজটি ইনস্টল করুন" এবং "ঠিক **** এই প্যাকেজটি সরান" ফাংশনগুলি খুঁজছি, আক্ষরিকভাবে কোনও প্রশ্ন জিজ্ঞাসা করা হয়নি।
দাদাকান্দি

2
আমি যেমন বলেছি, এগুলি তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলিতে উপলভ্য নয়। আপনি যদি নিজের সিস্টেম ইমেজ তৈরি করে থাকেন তবে আপনার প্ল্যাটফর্মের বাস্তবায়ন রয়েছে এবং আপনি সেখানে ফাংশনগুলি খুঁজে পেতে পারেন তবে এগুলি সাধারণ তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলিতে উপলব্ধ API এর অংশ নয়।
হ্যাকবড

আমি ইনস্টল, রিমুভ এবং ব্যাকআপ কার্যকারিতা সহ এপিপি ফাইল এক্সপ্লোরার তৈরি করছি, তাই গুগল আমাকে গুগল প্লেতে আমার অ্যাপ্লিকেশন প্রকাশ করার অনুমতি দেয়? এবং আমরা কোন নীতি ভঙ্গ করতে যাচ্ছি?
রাহুল মান্ডালিয়া

84

অ্যান্ড্রয়েড পি + এর AndroidManLive.xml এ এই অনুমতি প্রয়োজন

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

তারপর:

Intent intent = new Intent(Intent.ACTION_DELETE);
intent.setData(Uri.parse("package:com.example.mypackage"));
startActivity(intent);

আনইনস্টল করতে। আরও সহজ মনে হচ্ছে ...


এই কোড চালানো অ্যাপ হতে পারে? onDestroy()পদ্ধতি মত ?
মাহদী-মালভ

কীভাবে ACTION_INSTALL_PACKAGE? আমরা কী প্লে স্টোর থেকে আমাদের অ্যাপ্লিকেশনটি ডাউনলোড এবং ইনস্টল করতে পারি?
এমএএস। জন

3
যেহেতু অ্যান্ড্রয়েড পি মোছার অ্যাপ্লিকেশনগুলিতে ম্যানিফেস্টের অনুমতি দরকার "android.permission.REQUEST_DELETE_PACKAGES" আপনি যদি "ACTION_DELETE" বা "ACTION_UNINSTALL_PACKAGE" বিকাশকারী
ডার্কলর্ড

অ্যান্ড্রয়েড পি অনুমতি উল্লেখ করার জন্য আপনাকে ধন্যবাদ, আমি আটকে ছিলাম এবং আগে কী চলছে তা নিশ্চিত ছিলাম না।
অভি পরিশন

43

এপিআই স্তরের ১৪ টি দুটি নতুন ক্রিয়াকলাপ প্রবর্তন করেছে: ACTION_INSTALL_PACKAGE এবং ACTION_UNINSTALL_PACKAGE । এই ক্রিয়াকলাপগুলি আপনাকে EXTRA_RETURN museT পাস করার অনুমতি দেয় একটি (আন) ইনস্টলেশন ফলাফলের বিজ্ঞপ্তি পেতে এক্সট্রা_অরটার্ন্টারটি অতিরিক্ত ।

আনইনস্টল ডায়লগটি চাওয়ার জন্য কোড কোড:

String app_pkg_name = "com.example.app";
int UNINSTALL_REQUEST_CODE = 1;

Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);  
intent.setData(Uri.parse("package:" + app_pkg_name));  
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
startActivityForResult(intent, UNINSTALL_REQUEST_CODE);

এবং আপনার ক্রিয়াকলাপ # কার্যকারিতা ফলাফল পদ্ধতিতে বিজ্ঞপ্তিটি পান :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == UNINSTALL_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            Log.d("TAG", "onActivityResult: user accepted the (un)install");
        } else if (resultCode == RESULT_CANCELED) {
            Log.d("TAG", "onActivityResult: user canceled the (un)install");
        } else if (resultCode == RESULT_FIRST_USER) {
            Log.d("TAG", "onActivityResult: failed to (un)install");
        }
    }
}

আমি এই ক্রিয়া সংলাপ বাক্স থেকে কীভাবে নিশ্চিত করতে পারি যে কোনও ব্যবহারকারী ঠিকঠাক চাপ দিয়েছেন বা বাতিল করুন যাতে আমি এর ভিত্তিতে সিদ্ধান্ত নিতে পারি
এরম

2
@ ইরাম আমি যা চেয়েছিলাম তার একটি উদাহরণ যোগ করেছি
অ্যালেক্স লিপভ

ইনস্টলেশন চলাকালীন, বাতিল বোতামটি অন্টিভিটিআরসাল্ট পদ্ধতিতে কোনও ফল পেল না
ডায়োদা_

2
এপিআই 25 দিয়ে শুরু করে, কল ACTION_INSTALL_PACKAGEকরার জন্য স্বাক্ষর স্তরের REQUEST_INSTALL_PACKAGESঅনুমতি প্রয়োজন। তেমনি, এপিআই 28 (অ্যান্ড্রয়েড পি) দিয়ে শুরু করে, কল ACTION_UNINSTALL_PACKAGEকরার জন্য অ-বিপজ্জনক REQUEST_DELETE_PACKAGESঅনুমতি প্রয়োজন। কমপক্ষে ডক্স অনুসারে।
স্টিভ ব্ল্যাকওয়েল

22

আপনার যদি ডিভাইস মালিক (বা প্রোফাইলের মালিক, আমি চেষ্টা করিনি) অনুমতিটি আপনি নিঃশব্দে ডিভাইস মালিক এপিআই ব্যবহার করে প্যাকেজ ইনস্টল / আনইনস্টল করতে পারেন।

আনইনস্টল করার জন্য:

public boolean uninstallPackage(Context context, String packageName) {
    ComponentName name = new ComponentName(MyAppName, MyDeviceAdminReceiver.class.getCanonicalName());
    PackageManager packageManger = context.getPackageManager();
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        PackageInstaller packageInstaller = packageManger.getPackageInstaller();
        PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        params.setAppPackageName(packageName);
        int sessionId = 0;
        try {
            sessionId = packageInstaller.createSession(params);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        packageInstaller.uninstall(packageName, PendingIntent.getBroadcast(context, sessionId,
                new Intent("android.intent.action.MAIN"), 0).getIntentSender());
        return true;
    }
    System.err.println("old sdk");
    return false;
}

এবং প্যাকেজ ইনস্টল করতে:

public boolean installPackage(Context context,
                                     String packageName, String packagePath) {
    ComponentName name = new ComponentName(MyAppName, MyDeviceAdminReceiver.class.getCanonicalName());
    PackageManager packageManger = context.getPackageManager();
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        PackageInstaller packageInstaller = packageManger.getPackageInstaller();
        PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        params.setAppPackageName(packageName);
        try {
            int sessionId = packageInstaller.createSession(params);
            PackageInstaller.Session session = packageInstaller.openSession(sessionId);
            OutputStream out = session.openWrite(packageName + ".apk", 0, -1);
            readTo(packagePath, out); //read the apk content and write it to out
            session.fsync(out);
            out.close();
            System.out.println("installing...");
            session.commit(PendingIntent.getBroadcast(context, sessionId,
                    new Intent("android.intent.action.MAIN"), 0).getIntentSender());
            System.out.println("install request sent");
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    System.err.println("old sdk");
    return false;
}

আমি জানতাম এটির মালিক ডিভাইস হওয়ার কারণে এটি করা সম্ভব ছিল। উত্তর করার জন্য ধন্যবাদ!
লুক কেথেন

@ সন্দ্বীপ এটি সবেমাত্র এপিপি-র সামগ্রীটি আউটপুট স্ট্রিমের মধ্যে পড়েছে
ওহাদ কোহেন

@ লুকেকেউথন কি ডিভাইসের মালিক হয়ে চেষ্টা করেছেন? এটা কি কাজ করেছে?
নেটস্টার্টার

@ নেট স্টার্টার হ্যাঁ আমার আছে। গাধাটি কোনও অ্যাপ্লিকেশনটিকে ডিভাইসের মালিক হতে পাওয়ার জন্য কেবল ব্যথা। একবার আপনি এটি করার পরে, আপনি প্রচুর শক্তি পান যার জন্য সাধারণত মূলের প্রয়োজন হয়।
লুক কউথেন

1
অনুগ্রহ করে নোট করুন যে আপনাকে আনইনস্টল কাজ করার জন্য (এপিআই স্তরের 22 বা তার অধীনে পরীক্ষা করা হয়েছে) আপনার ম্যানিফেস্টে অবশ্যই android.permission.DELETE_PACKAGES যুক্ত করতে হবে
বেঞ্চুক

4

এই পদ্ধতিগুলি অ্যাক্সেস করার একমাত্র উপায় হ'ল প্রতিচ্ছবি। আপনি এই পদ্ধতিগুলিতে PackageManagerকল করে getApplicationContext().getPackageManager()এবং প্রতিবিম্ব অ্যাক্সেস ব্যবহার করে কোনও সামগ্রীতে একটি হ্যান্ডেল পেতে পারেন । এই টিউটোরিয়াল চেকআউট ।


এটি ২.২ সহ দুর্দান্ত কাজ করে, তবে এটি 2.3 দিয়ে ব্যবহার করার মতো ভাগ্য আমার হয়নি
কোথাও কোথাও

3
সমস্ত এপিআই সংস্করণগুলিতে প্রতিচ্ছবি স্থিতিশীল নয়
হ্যান্ডলার এক্সপ্লয়েট

3

ফ্রয়েও সোর্স কোড অনুসারে, ইনটেন্ট.আরেক্টরা.অ্যান্টএসটিএসটিএলএসএআরএলএসএপিএকিএপিএলএক্স অতিরিক্ত কীটি প্যাকেজইনস্টলারঅ্যাক্টিভিটিতে ইনস্টলার প্যাকেজের নামের জন্য অনুসন্ধান করা হয়েছে।


1
এই প্রতিশ্রুতিটি দেখে আমি মনে করি এটি কাজ করা উচিত
sergio91pt

2

মূলযুক্ত ডিভাইসে আপনি ব্যবহার করতে পারেন:

String pkg = context.getPackageName();
String shellCmd = "rm -r /data/app/" + pkg + "*.apk\n"
                + "rm -r /data/data/" + pkg + "\n"
                // TODO remove data on the sd card
                + "sync\n"
                + "reboot\n";
Util.sudo(shellCmd);

Util.sudo() এখানে সংজ্ঞায়িত করা হয়।


এসডিকার্ডে প্রাক-ডাউনলোড অ্যাপ্লিকেশন ইনস্টল করারও কি উপায় আছে? বা অ্যান্ড্রয়েড প্ল্যাটফর্মের শেলটিতে আমরা কোন আদেশগুলি ব্যবহার করতে পারি তা যাচাই করার জন্য আপনি কোনও পৃষ্ঠায় আমাকে পরামর্শ দিতে পারেন?
ইয়াহিয়া

1
@yahya developer.android.com/tools/help/shell.html "pm android", pm = প্যাকেজ ম্যানেজার
18446744073709551615

1
@ ইয়াহিয়া চিটোগ্রাফি. com/ citguy/ cheat - sheets/ android - package - manager- বিকাল সেট-ইনস্টল অবস্থান
18446744073709551615

অনেক ধন্যবাদ! এই লিঙ্কগুলি :) এর সাথে শুরু করার জন্য সত্যিই দুর্দান্ত গাইড
ইয়াহিয়া

@ ভি.কলিউজনি এটি ২০১৫ সালে ফিরে কাজ করত I
18446744073709551615

2

যদি আপনি আপনার ব্যবহারকারীর সংজ্ঞায়িত ফাংশনটির কোনওটির প্যারামিটার হিসাবে নামটি পাস করেন তবে নীচের কোডটি ব্যবহার করুন:

    Intent intent=new Intent(Intent.ACTION_DELETE);
    intent.setData(Uri.parse("package:"+packageName));
    startActivity(intent);

0

আপনি যদি কোটলিন, এপিআই 14+ ব্যবহার করছেন এবং আপনার অ্যাপ্লিকেশনটির জন্য কেবল আনইনস্টল ডায়ালগটি দেখানোর ইচ্ছা করতে পারেন:

startActivity(Intent(Intent.ACTION_UNINSTALL_PACKAGE).apply {
    data = Uri.parse("package:$packageName")
})

আপনি packageNameযদি ডিভাইসে অন্য অ্যাপ্লিকেশনটি আনইনস্টল করতে ব্যবহারকারীকে অনুরোধ করতে চান তবে আপনি অন্য কোনও প্যাকেজ নামে পরিবর্তন করতে পারেন


0

পূর্বশর্তঃ

আপনার এপিএকে ঠিক আগের মতো নির্দেশিত হিসাবে সিস্টেমের মাধ্যমে স্বাক্ষর করা দরকার। এটি অর্জনের একটি উপায় হ'ল নিজেকে এওএসপি চিত্র তৈরি করা এবং উত্সের কোডটিতে সোর্স কোড যুক্ত করা।

কোড:

একবার সিস্টেম অ্যাপ্লিকেশন হিসাবে ইনস্টল হয়ে গেলে আপনি কোনও APK ইনস্টল ও আনইনস্টল করার জন্য প্যাকেজ পরিচালকের পদ্ধতিগুলি ব্যবহার করতে পারেন:

ইনস্টল করুন:

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;
    }
}

আপনার APK একবার ইনস্টল / আনইনস্টল হয়ে গেলে কলব্যাক পেতে আপনি এটি ব্যবহার করতে পারেন:

/**
 * 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);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.