কম্পিউটার টিউটোরিয়াল

অ্যান্ড্রয়েডে প্রোগ্রাম্যাটিক্যালি APK আনইনস্টল করার পদ্ধতি

অ্যান্ড্রয়েডে কোনো অ্যাপ্লিকেশন (APK) প্রোগ্রাম্যাটিক্যালি আনইনস্টল করার জন্য `Intent.ACTION_DELETE` ব্যবহার করা হয়। এটি ব্যবহারকারীকে সিস্টেমের আনইনস্টল কনফার্মেশন ডায়ালগে নিয়ে যায়, যেখানে তারা আনইনস্টল কনফার্ম করেন। নিচে সম্পূর্ণ ইমপ্লিমেন্টেশন দেওয়া হলো।

কীভাবে কাজ করে?

  1. `Intent.ACTION_DELETE` অ্যাকশন সহ একটি ইন্টেন্ট তৈরি করা।
  2. `Uri.parse("package:com.package.name")` দিয়ে প্যাকেজ নাম স্পেসিফাই করা।
  3. `startActivity()` দিয়ে সিস্টেম আনইনস্টলার লঞ্চ করা।
গুরুত্বপূর্ণ: আপনার অ্যাপ স্বয়ংক্রিয়ভাবে ব্যাকগ্রাউন্ডে কোনো অ্যাপ আনইনস্টল করতে পারবে না (সিস্টেম সিগনaturen সিস্টেম অ্যাপ বা ডিভাইস ഓনার অ্যাপ ছাড়া)। ব্যবহারকারীকে সবসময় কনফার্মেশন ডায়ালগে অনুমতি দিতে হয়।

১. 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 ActivityResultLauncher uninstallLauncher = 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()` ব্যবহার করে সাইলেন্ট আনইনস্টল করা যায়। কিন্তু সাধারণ থার্ড-পার্টি অ্যাপের জন্য এটি প্রযোজ্য নয়।

টেস্টিং টিপস

  1. অ্যাপটি রান করুন।
  2. "Uninstall This App" বাটনে ক্লিক করুন।
  3. সিস্টেম ডায়ালগ পপ আপ হবে: "Do you want to uninstall this app?"
  4. "OK" চাপলে অ্যাপ আনইনস্টল হয়ে যাবে।
  5. "Cancel" চাপলে অ্যাপ চলতে থাকবে।

সামान्य সমস্যা ও সমাধান

  • ActivityNotFoundException: `intent.resolveActivity()` চেক করুন।
  • প্যাকেজ নাম ভুল: `getPackageName()` ব্যবহার করুন হاردকোড না করে।
  • অ্যাপ আনইনস্টল হয় না: ডিভাইস অ্যাডমিন চেক করুন, বা ইউজার ক্যാൻসেল করেছে কিনা।

এই পদ্ধতিটি অ্যান্ড্রয়েডের অফিশিয়াল এবং একমাত্র নন-রুট উপায় যেটি ব্যবহারকারীর সম্মতিতে অ্যাপ আনইনস্টল করে। আপনার অ্যাপে "Uninstall" বাটন দেয়ার জন্য এটি আদর্শ সমাধান।

  1. অ্যান্ড্রয়েডে প্রোগ্রাম্যাটিক্যালি বাটনে drawableLeft সেট করার পদ্ধতি

  2. অ্যান্ড্রয়েডে প্রোগ্রাম্যাটিক্যালি BroadcastReceiver নিবন্ধন করার পদ্ধতি

  3. অ্যান্ড্রয়েডে ScrollView প্রোগ্রাম্যাটিক্যালি ডিজেবল করার পদ্ধতি

  4. Android-এ প্রোগ্রামেটিক্যালি অ্যাপ্লিকেশন বন্ধ করা