نصب برنامه APK در اندروید

منتشرشده توسط حامد قنبری در تاریخ

در این مبحث قصد داریم روشی را برای دوستان توضیح دهیم که در آن بتوانند برنامه ای با فرمت فایل Apk  را از external Storge به روش اینتنت فراخوانی کرده و ان را نصب کنند. لازم به ذکر است که روش اراپه شده نیز قابلیت پشتیبانی گوشی هایی با اندروید 7 به بالا را هم دارد.

اگر در داخل برنامه اکلیپس یا اندروید استودیو قرار دارید پروژه جدیدی را  ایجاد کنید

اکلیپس :File ⇒ New Android ⇒ Application Project

اندروید استودیو :File ⇒ New  ⇒ New Project

اما اگر هنوز برنامه خود را باز نکرده اید یکی از برنامه های فوق را باز نموده و بعد از تعیین مشخصات(نامگذاری) ، تعیین حداقل sdk  و نوع اکتیویتی (blank  یا Empty) ، نام اکتیویتی ابتدایی و اصلی خود  را همان MainActivity قرار دهید. بعد از لود کامل برنامه ، در مسیر res ⇒layout لایه متناظر اکتیوتی اصلی یعنی activity_main را پیدا نمود و کدهای مندرج و پیش فرض آن را پاک کرده و کدهای xml  زیر را به آن اضافه کنید:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="آدرس پکیج و اکتیوتی شما">

    <Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="110dp"
        android:id="@+id/b" />
</RelativeLayout>

همانطور که در بالا می بینیم در لایوت مربوط به اکتیویتی اصلی باتنی را با ایدی button تعریف کرده ایم. که قرار است که با کلیک بر روی عملیات نصب انجام شود. به این صورت که ابتدا با تعیین مسیر دایرکتوری فایل apk  آن را فراخوانی کرده و سپس نصب کنیم.

برای این کار ما متدی را تعریف کرده ایم که این متد از طریق اینتنت از طریق مسیر تعیین شده در آرگومان خود و با افزودن مجوز و ارسال نوع  دیتای نصب  اقدام به نصب فایل مورد نظرمان خواهد کرد. پس ضروری است در گام اول آدرس فایل موردنظر خودمان را تعریف کنیم. برای تعریف ادرس فایل ابتدا کلاس فایل را فراخوانی می کنیم و سپس در درون آرگومان  آن آدرس مسیر فایل خود را مشخص می کنیم به این صورت:

final File toInstall = new File(path);

در این جا path  همان آدرس فایل مورد نظرمان خواهد بود.  و متغیر اختیاری toinstall  همان نوع متغیری خواهد بود که افزون بر آدرس ماهیت آن که از نوع file است مشخص شده است.

برای تعریف آدرس نیز از روش متداول زیر استفاده می کنیم:

String path = Environment.getExternalStorageDirectory() + "/Download/" + "your.apk";

همانطور که می بینید در این روش قرار است فایل apk  از فایل خارجی اندروید که در فایل Download  قرار دارد فراخوانی شده و سپس آدرس آن در متغیر path  ذخیره شود.

در گام بعدی ایجاد شرط برای شناسایی نسخه اندروید است . با توجه به اینکه مجوزها در اندوید 6 به بالا از سخت گیری بیشتری نسبت به نسخه های پایین تر از خود برخوردار است از این رو شرط ابتدا بررسی می کند اگر نسخه اندروید بالاتر از نسخه 24 باشد(البته SDK)  از روشی به نام Provider  برای فراخوانی فایل استفاده می کند. در روش زیر ما در مانیفست اندروید برای آدرسی که قرار است فایل را از آن فراخوانی کنیم مجوز می گیریم که از لحاظ امنیتی روش بسیار مطلوبی است و در نسخه 6 به بالا تعبیه شده است. سینتکس کلی آن بصورت زیر می باشد.

Uri apkUri = FileProvider.getUriForFile(context, “sheiday.ptsu.com.installer.fileprovider”, toInstall);

برای تعریف آدرس apk  به منظور نصب آن مجبور هستیم از کلاسی بنام Uri  بهره بگیریم که در آن  مجوز دسترسی به آدرس  فایل به پکیجی که در بالا ذکر شده است داده می شود.  برای آموزش این روش اینجا کلیک کنید.

سپس به منظور نصب برنامه از روشی به نام اینتنت استفاده می کنیم که بصورت زیر نوشته می شود.

    Intent install = new Intent(Intent.ACTION_VIEW);
        // افزودن flag  از نوع new task
        install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// افزودن مجوز به اینتنت
        
        install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// افزودن نوع عملیات اینتنت
        install.setDataAndType(apkUri, "application/vnd.android.package-archive");
// شروع نصب
        context.startActivity(install);

دقت داشته باشید context  در کد بالا همان this  است که در بالای oncreate  بصورت زیر تعریف شده است.

final Context context = this;
public void InstallUpdate(String path) {
    final File toInstall = new File(path);
    if (Build.VERSION.SDK_INT >= 24) {
        Uri apkUri = FileProvider.getUriForFile(context, "sheiday.ptsu.com.installer.fileprovider", toInstall);
        Intent install = new Intent(Intent.ACTION_VIEW);
        install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        install.setDataAndType(apkUri, "application/vnd.android.package-archive");
        context.startActivity(install);

    } else {
        Uri apkUri = Uri.fromFile(toInstall);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        this.startActivity(intent);


    }
}

در نهایت کد های MainActivity  به شکل زیر خواهد بود :

افزون بر کدهای زیر کدهای مربوط به درخواست مجوز از کاربران و حذف فایل را به کدهای توضیح داده شده اضافه کرده ام که بدون هیچ مشکلی بتوانید برنامه خود را بنویسید . برای یادگیری مربوط به مجوزها از مبحث آموزشی مربوط به درخواست مجوزها در اندروید استفاده کنید.

package "نام پکیج شما";

import android.Manifest;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.FileProvider;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;


public class MainActivity extends Activity {
  

    final Context context = this;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button mybutton = (Button)findViewById(R.id.b);
        mybutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
String path = Environment.getExternalStorageDirectory() + "/Download/" + "your.apk";
                InstallUpdate(path );

            }
        });
    }




    public void InstallUpdate(String path) {
        final File toInstall = new File(path);
        if (Build.VERSION.SDK_INT >= 24) {
            Uri apkUri = FileProvider.getUriForFile(context, "sheiday.ptsu.com.installer.fileprovider", toInstall);
            Intent install = new Intent(Intent.ACTION_VIEW);
            install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            install.setDataAndType(apkUri, "application/vnd.android.package-archive");
            context.startActivity(install);

        } else {
            Uri apkUri = Uri.fromFile(toInstall);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            this.startActivity(intent);


        }
    }

    public boolean isStoragePermissionGranted() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                Log.v(TAG, "Permission is granted");
                return true;
            } else {

                Log.v(TAG, "Permission is revoked");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                return false;
            }
        } else { //permission is automatically granted on sdk<23 upon installation
            Log.v(TAG, "Permission is granted");
            return true;
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.v(TAG, "Permission: " + permissions[0] + "was " + grantResults[0]);
            //resume tasks needing this permission
        }
    }

    public void Deleteupdeate() {
        File file = new File(Environment.getExternalStorageDirectory() + "/Download/" + "yourapk.apk");
        boolean d = file.delete();
        if (file.exists()) {
            try {
                file.getCanonicalFile().delete();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (file.exists()) {
                getApplicationContext().deleteFile(file.getName());
            }
            if (!file.exists()) {
                Toast.makeText(this, "delete file downloaded", Toast.LENGTH_LONG).show();
            }
        }
    }
}



در نهایت در قسمت مانیفیست کدهای زیر قرار میدهیم .

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="yournamePackge" >
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="yourpackge.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepath" />
        </provider>
    </application>

</manifest>

سپس با ایجاد پوشه  XML – لایوت Xml جدیدی را  از منوی new resorce xml (با کلیک راست برروی پوشه XML) ایجاد می کنیم و کدهای زیر را در آن قرار می دهیم.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path path="" name="download"/>
    </paths>
</resources>

در نهایت برنامه را اجرا کرده و در آموزش هرچه بیشتر  خود بهره بگیرید. کپی برداری  برای سایت ها و وبلاگ ها هم من راضی نیستم.

 

 

 

 


0 دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

-- بارگیری کد امنیتی --