نصب برنامه 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 دیدگاه