অ্যান্ড্রয়েডে কোনো অ্যাপ্লিকেশন (APK) প্রোগ্রাম্যাটিক্যালি আনইনস্টল করার জন্য `Intent.ACTION_DELETE` ব্যবহার করা হয়। এটি ব্যবহারকারীকে সিস্টেমের আনইনস্টল কনফার্মেশন ডায়ালগে নিয়ে যায়, যেখানে তারা আনইনস্টল কনফার্ম করেন। নিচে সম্পূর্ণ ইমপ্লিমেন্টেশন দেওয়া হলো।
কীভাবে কাজ করে?
- `Intent.ACTION_DELETE` অ্যাকশন সহ একটি ইন্টেন্ট তৈরি করা।
- `Uri.parse("package:com.package.name")` দিয়ে প্যাকেজ নাম স্পেসিফাই করা।
- `startActivity()` দিয়ে সিস্টেম আনইনস্টলার লঞ্চ করা।
১. activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="24dp">
<TextView
android:id="@+id/tvInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="নিচের বাটনে ক্লিক করে বর্তমান অ্যাপটি আনইনস্টল করুন"
android:textSize="16sp"
android:textAlignment="center"
android:layout_marginBottom="24dp" />
<Button
android:id="@+id/btnUninstall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Uninstall This App"
android:backgroundTint="@android:color/holo_red_dark"
android:textColor="@android:color/white" />
</LinearLayout>
২. MainActivity.java
package com.example.uninstallapk;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnUninstall = findViewById(R.id.btnUninstall);
btnUninstall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
uninstallCurrentApp();
}
});
}
private void uninstallCurrentApp() {
// বর্তমান অ্যাপের প্যাকেজ নাম ডাইনামিক্যালি পাওয়া
String packageName = getPackageName(); // e.g., "com.example.uninstallapk"
// আনইনস্টল ইন্টেন্ট তৈরি
Intent intent = new Intent(Intent.ACTION_DELETE);
intent.setData(Uri.parse("package:" + packageName));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // ভালো প্র্যাকটিস
// অ্যাক্টিভিটি হ্যান্ডেলার আছে কিনা চেক (সেফটি)
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Toast.makeText(this, "Uninstaller not found", Toast.LENGTH_SHORT).show();
}
}
}
৩. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.uninstallapk">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.UninstallApk">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
অন্য কোনো অ্যাপ আনইনস্টল করা (Known Package Name)
// নির্দিষ্ট প্যাকেজ আনইনস্টল করার ফাংশন
public void uninstallPackage(String targetPackageName) {
Intent intent = new Intent(Intent.ACTION_DELETE);
intent.setData(Uri.parse("package:" + targetPackageName));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
// ব্যবহার:
// uninstallPackage("com.facebook.katana"); // Facebook আনইনস্টল করবে
// uninstallPackage("com.whatsapp"); // WhatsApp আনইনস্টল করবে
উন্নত ফিচার: আনইনস্টল রেজাল্ট লিসেনার (API 23+)
আপনি জানতে চাইলে আনইনস্টল সফল হয়েছে কিনা, `startActivityForResult()` (ডিপ্রিকেইটেড) বা মডার্ন `ActivityResultContracts` ব্যবহার করুন:
// Modern ActivityResult API (Activity/Fragment-এ) private final ActivityResultLauncheruninstallLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { // User confirmed uninstall - but app might still be installing the uninstall // Actual removal happens asynchronously Toast.makeText(this, "Uninstall confirmed by user", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Uninstall cancelled", Toast.LENGTH_SHORT).show(); } } ); // Usage: uninstallLauncher.launch(intent);
সীমাবদ্ধতা ও সতর্কতা
| সমস্যা | ব্যাখ্যা |
|---|---|
| সাইলেন্ট আনইনস্টল নয় | ব্যবহারকারী সবসময় কনফার্ম করবেন। সাইলেন্ট আনইনস্টল শুধু সিস্টেম/ডিভাইস-অনার অ্যাপে সম্ভব। |
| সেলফ-আনইনস্টল বیهেভিয়ার | যদি অ্যাপ নিজে নিজের আনইনস্টল ইন্টেন্ট লঞ্চ করে, তবে আনইনস্টল শুরু হলে অ্যাপটি টার্মিনেট হয়। `onDestroy()` কল হবে। |
| ডিভাইস অ্যাডমিন অ্যাপ | যদি অ্যাপ ডিভাইস অ্যাডমিন হয়, আনইনস্টল ব্লক থাকবে। প্রথমে ডিভাইস অ্যাডমিন ডিএ্যাক্টিভেট করতে হবে। |
| Work Profile / Managed Profile | কর্পোরেট প্রোফাইলে পলিসি ব্লক করতে পারে। |
বিকল্প: প্যাকেজ ইনস্টলার API (API 22+)
যদি আপনার অ্যাপে `REQUEST_DELETE_PACKAGES` পারমিশন থাকে (সিস্টেম প্রিভিলেজড অ্যাপের জন্য), তবে `PackageInstaller.uninstall()` ব্যবহার করে সাইলেন্ট আনইনস্টল করা যায়। কিন্তু সাধারণ থার্ড-পার্টি অ্যাপের জন্য এটি প্রযোজ্য নয়।
টেস্টিং টিপস
- অ্যাপটি রান করুন।
- "Uninstall This App" বাটনে ক্লিক করুন।
- সিস্টেম ডায়ালগ পপ আপ হবে: "Do you want to uninstall this app?"
- "OK" চাপলে অ্যাপ আনইনস্টল হয়ে যাবে।
- "Cancel" চাপলে অ্যাপ চলতে থাকবে।
সামान्य সমস্যা ও সমাধান
- ActivityNotFoundException: `intent.resolveActivity()` চেক করুন।
- প্যাকেজ নাম ভুল: `getPackageName()` ব্যবহার করুন হاردকোড না করে।
- অ্যাপ আনইনস্টল হয় না: ডিভাইস অ্যাডমিন চেক করুন, বা ইউজার ক্যാൻসেল করেছে কিনা।
এই পদ্ধতিটি অ্যান্ড্রয়েডের অফিশিয়াল এবং একমাত্র নন-রুট উপায় যেটি ব্যবহারকারীর সম্মতিতে অ্যাপ আনইনস্টল করে। আপনার অ্যাপে "Uninstall" বাটন দেয়ার জন্য এটি আদর্শ সমাধান।