به کمک اندروید سورس با فروش محصولات خود به راحتی کسب درآمد کنید. (جزئیات بیشتر)

کار با مجوزها در اندروید ۶

ابرپوسته چندمنظوره و فروشگاهی انویژن

4.00 stars
  |   55 فروش
خرید و دانلود
کار با مجوزها در اندروید ۶
  • شناسه محصول
    756
  • Verified Product
  • Iranian Product
  • Professional Product

توضیحات محصول

نحوه کار با مجوز ها در زمان اجرای برنامه در اندروید Marshallow(M)

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

دانلود فایل نصبی سورس

اکنون این سوال پیش می آید که چگونه یک برنامه می تواند درخواست گرفتن مجوز را ارسال کند ؟ یا چه گردش کاری را باید توسعه دهنده یا برنامه نویس دنبال کند تا بتواند مجوز های مورد نیاز برای برنامه خود را کسب کند ؟
مدل مجوز ها (permission model) از Api 23 تغییر کرده است.

مدل مجوز ها قبل از Api23

قبل از Api23 ، استفاده از مجوز ها برای توسعه دهندگان بسیار ساده و راحت بود، اما کنترل و امنیت کمی داشت. وقتی به کاربر درخواست گرفتن مجوز صادر می شد، کاربر باید تصمیم می گرفت که آیا مجوز های درخواست شده توسط برنامه را تایید کند یا از نصب برنامه منصرف شود. مجوز ها نمی توانستند بعد از نصب به برنامه داده شوند یا از آن گرفته شوند. بنابراین توسعه دهندگان مجبور بودند تمام مجوز های مورد نیاز برای برنامه های خود را به طور آشکار به کاربر اعلام کنند.

مدل مجوز ها از Api23

اما در اندروید ۶.۰ ، یک مجوز جدید در زمان اجرا معرفی شده است.بر اساس این مدل ، مجوز های مورد نیاز برنامه هنگام نصب برنامه به کاربر نشان داده نمی شود.توسعه دهندگان باید نیاز های برنامه خود را در زمان اجرا بررسی کنند و براساس آن مجوز های مورد نیاز خود را برای کاربر ارسال کند و کاربر تصمیم می گیرد که آیا این مجوز را در اختیار برنامه قرار دهد یا نه ، بنابراین کاربر از قسمت تنظیمات می تواند، هر زمان مجوز را از برنامه بگیرد یا به آن بدهد،استفاده کاربر از برنامه های اندروید بسیار مطمئن تر شده است.

سطح های مجوز

سیستم مجوز ها دارای سطح های محافظتی متفاوتی است.دو سطح مهم محافظتی به نام های مجوز های معمولی (normal permissions) و مجوز های خطرناک (dangerous permissions) وجود دارد.
مجوز های معمولی: این مجوز ها تاثیری بسیار کم در حفظ امنیت کاربران دارد و در دسته مجوز های معمولی جا داده می شوند. خود سیستم به جای کاربر مجوز های معمولی را هنگام نیاز در اختیار برنامه قرار میدهد.مانند ACCESS_WIFI_STATE و WAKE_LOCK
مجوز های خطرناک: این مجوز ها تاثیری بسیار زیاد در حفظ امنیت کاربران دارد و در دسته مجوز های خطرناک جا داده می شوند. برای مثال می توان به مجوز خواندن لیست مخاطبان کاربر (READ_CONTACTS) اشاره کرد. اگر یک برنامه درخواست مجوز خطرناک را صادر کند ، خود کاربر می تواند این مجوز را به برنامه بدهد.

ساخت یک پروژه

۱-یک پروژه در Android Studio با رفتن به مسیر  File ⇒ New Project بسازید.
۲-فایل strings.xml را باز کنید و کد های زیر را در آن قرار بدهید.

strings.xml
<resources>
    <string name="app_name">M Permissions</string>
    <string name="action_settings">Settings</string>
    <string name="single_permission_text">(Click on FAB to check Single permission.\nTo test again, change the app permission in settings or reinstall the app)</string>
</resources>

 

۳-فایل build.gradle را بازکنید و مطمئن شوید مقادیر minSdkVersion و targetSdkVersion برای پشتیبانی از مدل مجوز ها را اضافه کرده اید.

apply plugin: 'com.android.application'
 
android {
    defaultConfig {
        ..
        minSdkVersion 17
        targetSdkVersion 23
        ..
    }
}

 

۳.۱-درخواست یک مجوز

۴-گرچه ما نیاز داریم درخواست مجوز را در زمان اجرا صادر کنیم ، اما باید آن را به کاربر نشان دهیم. ما اول با WRITE_EXTERNAL_STORAGE_PERMISSION شروع می کنیم. برای این کار فایل AndroidManifest.xml را باز کنید و دستورات زیر را به آن اضافه کنید.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="info.androidhive.mpermissions">
 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name="info.androidhive.mpermissions.MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>

 

۵-فایل activity_main.xml را باز کنید و کد های زیر را در آن قرار بدهید. این لایه شامل چندین دکمه برای تست چندین مجوز می باشد.

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="info.androidhive.mpermissions.MainActivity">
 
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
 
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
 
    </android.support.design.widget.AppBarLayout>
 
    <RelativeLayout
        android:id="@+id/content_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"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context="info.androidhive.mpermissions.MainActivity"
        tools:showIn="@layout/activity_main">
 
        <Button
            android:id="@+id/btnLaunchMultiplePermission"
            android:layout_below="@+id/imageView"
            android:layout_marginTop="20dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Request Multiple Permissions"/>
 
        <Button
            android:id="@+id/btnLaunchPermissionFragment"
            android:layout_below="@+id/btnLaunchMultiplePermission"
            android:layout_marginTop="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Request Permission on Fragment"/>
 
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/single_permission_text"
            android:textAlignment="center"
            android:layout_alignParentBottom="true"
            android:layout_alignParentStart="true"
            android:layout_marginBottom="123dp" />
 
    </RelativeLayout>
 
    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@drawable/ic_file_download_black_24dp" />
 
</android.support.design.widget.CoordinatorLayout>

 

لایه بالا چیزی مانند تصویر زیر می سازد

مجوزها دراندروید 6

 

۶-فایل MainActivity.java را باز کنید و کد های زیر را در  FAB click event قرار بدهید.

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                //Show Information about why you need the permission
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("Need Storage Permission");
                builder.setMessage("This app needs storage permission.");
                builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_CONSTANT);
                    }
                });
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
                builder.show();
            } else if (permissionStatus.getBoolean(Manifest.permission.WRITE_EXTERNAL_STORAGE,false)) {
                //Previously Permission Request was cancelled with 'Dont Ask Again',
                // Redirect to Settings after showing Information about why you need the permission
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("Need Storage Permission");
                builder.setMessage("This app needs storage permission.");
                builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                        sentToSettings = true;
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", getPackageName(), null);
                        intent.setData(uri);
                        startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
                        Toast.makeText(getBaseContext(), "Go to Permissions to Grant Storage", Toast.LENGTH_LONG).show();
                    }
                });
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
                builder.show();
            } else {
                //just request the permission
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_CONSTANT);
            }
 
            SharedPreferences.Editor editor = permissionStatus.edit();
            editor.putBoolean(Manifest.permission.WRITE_EXTERNAL_STORAGE,true);
            editor.commit();
 
 
        } else {
            //You already have the permission, just go ahead.
            proceedAfterPermission();
        }

ما تمام مجوز ها را با متد checkSelfPermission() بررسی می کنیم که آیا برنامه مجوز دسترسی به حافظه خارجی را دارد یا نه.
در اینجا ما از متد shouldShowRequestPermissionRationale() برای بررسی اینکه آیا ما باید دریافت مجوز توضیحی صادر کنیم یا نه استفاده میکنیم . اگر خروجی True باشد ما باید یک پیغام با توضیحات به کاربر نشان دهیم و اگر خروجی برابر False بود ، ما بطور ساده درخواست مجوز را ارسال می کنیم.
ما نیاز داریم تا متد onRequestPermissionsResult را برای دریافت نتیجه بازبینی کنیم. در این متد اول ما بررسی می کنیم که کد درخواستی ما برابر

requestCode == EXTERNAL_STORAGE_PERMISSION_CONSTANT باشد و بعد بررسی می کنیم که آیا طول grantResult  از صفر بیشتر است یا نه؟  اگر از صفر بیشتر باشد، کاربر تصمیمی درباره مجوز برنامه گرفته است. سپس مقدار شاخص grant result را بررسی می کنیم.اگر مقدار برابر PackageManager.PERMISSION_GRANTED بود یعنی مجوز توسط کاربر به برنامه داده شده است و ما به کار خود ادامه می دهیم و غیر این صورت این فرایند را دوباره انجام می دهیم.
افزودن به SharedPreferences جایی که کاربر تصمیم گرفته است دادن مجوز به ما را لغو کند.در این سناریو با استفاده از متدد shouldShowRequestPermissionRationale مقدار false برمی گرداند و متد requestPermissions  کاری نمی کند.

کد کامل فایل MainActivity.java

MainActivity.java
package info.androidhive.mpermissions;
 
import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
 
public class MainActivity extends AppCompatActivity {
   private static final int EXTERNAL_STORAGE_PERMISSION_CONSTANT = 100;
   private static final int REQUEST_PERMISSION_SETTING = 101;
   private boolean sentToSettings = false;
   private SharedPreferences permissionStatus;
 
 
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
 
 
       permissionStatus = getSharedPreferences("permissionStatus",MODE_PRIVATE);
 
 
       FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
       fab.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                   if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                       //Show Information about why you need the permission
                       AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                       builder.setTitle("Need Storage Permission");
                       builder.setMessage("This app needs storage permission.");
                       builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               dialog.cancel();
                               ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_CONSTANT);
                           }
                       });
                       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               dialog.cancel();
                           }
                       });
                       builder.show();
                   } else if (permissionStatus.getBoolean(Manifest.permission.WRITE_EXTERNAL_STORAGE,false)) {
                       //Previously Permission Request was cancelled with 'Dont Ask Again',
                       // Redirect to Settings after showing Information about why you need the permission
                       AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                       builder.setTitle("Need Storage Permission");
                       builder.setMessage("This app needs storage permission.");
                       builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               dialog.cancel();
                               sentToSettings = true;
                               Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                               Uri uri = Uri.fromParts("package", getPackageName(), null);
                               intent.setData(uri);
                               startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
                               Toast.makeText(getBaseContext(), "Go to Permissions to Grant Storage", Toast.LENGTH_LONG).show();
                           }
                       });
                       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               dialog.cancel();
                           }
                       });
                       builder.show();
                   } else {
                       //just request the permission
                       ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_CONSTANT);
                   }
 
 
                   SharedPreferences.Editor editor = permissionStatus.edit();
                   editor.putBoolean(Manifest.permission.WRITE_EXTERNAL_STORAGE,true);
                   editor.commit();
 
 
 
 
               } else {
                   //You already have the permission, just go ahead.
                   proceedAfterPermission();
               }
           }
       });
 
 
     }
 
 
   private void proceedAfterPermission() {
       //We've got the permission, now we can proceed further
       Toast.makeText(getBaseContext(), "We got the Storage Permission", Toast.LENGTH_LONG).show();
   }
 
   @Override
   public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
       super.onRequestPermissionsResult(requestCode, permissions, grantResults);
       if (requestCode == EXTERNAL_STORAGE_PERMISSION_CONSTANT) {
           if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               //The External Storage Write Permission is granted to you... Continue your left job...
               proceedAfterPermission();
           } else {
               if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                   //Show Information about why you need the permission
                   AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                   builder.setTitle("Need Storage Permission");
                   builder.setMessage("This app needs storage permission");
                   builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int which) {
                           dialog.cancel();
 
 
                           ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_PERMISSION_CONSTANT);
 
 
                       }
                   });
                   builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int which) {
                           dialog.cancel();
                       }
                   });
                   builder.show();
               } else {
                   Toast.makeText(getBaseContext(),"Unable to get Permission",Toast.LENGTH_LONG).show();
               }
           }
       }
   }
 
 
   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
       if (requestCode == REQUEST_PERMISSION_SETTING) {
           if (ActivityCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
               //Got Permission
               proceedAfterPermission();
           }
       }
   }
 
 
   @Override
   protected void onPostResume() {
       super.onPostResume();
       if (sentToSettings) {
           if (ActivityCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
               //Got Permission
               proceedAfterPermission();
           }
       }
   }
}

 

permissions in android 6

 

permissions in android 6

 

۳.۲-درخواست چندین مجوز

برای ارسال درخواست چندین مجوز بجای استفاده چندین پیغام از یک پیغام استفاده می کنیم.
۷-یک فایل با نام MultiplePermissionsActivity.java بسازید و کد های زیر را در آن قرار بدهید.

activity_multiple_permissions.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="info.androidhive.mpermissions.FragmentPermissionActivity">
 
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
 
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
 
    </android.support.design.widget.AppBarLayout>
 
 
    <LinearLayout
        android:id="@+id/activity_multiple_permissions"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context="info.androidhive.mpermissions.MultiplePermissionsActivity">
 
        <TextView
            android:id="@+id/txtPermissions"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
 
        <Button
            android:id="@+id/btnCheckPermissions"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Check Permissions" />
 
    </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

 

 

۸-دکمه  btnLaunchMultiplePermission را درون فایل MainActivity.java قسمت oncreate  مقداردهی کنید و کد های زیر را برای آن قرار دهید.

Button btnLaunchMultiplePermission = (Button) findViewById(R.id.btnLaunchMultiplePermission);
btnLaunchMultiplePermission.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       Intent intent = new Intent(MainActivity.this, MultiplePermissionsActivity.class);
       startActivity(intent);
   }
});

 

۹-درون فایل AndroidManifest.xml مجوز های زیر را اضافه کنید.

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

 

۱۰-فایل MultiplePermissionsActivity.java را بازکنید و کد های زیر را در آن اصلاح کنید.

MultiplePermissionsActivity.java
package info.androidhive.mpermissions;
 
import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
public class MultiplePermissionsActivity extends AppCompatActivity {
 
    private static final int PERMISSION_CALLBACK_CONSTANT = 100;
    private static final int REQUEST_PERMISSION_SETTING = 101;
    String[] permissionsRequired = new String[]{Manifest.permission.CAMERA,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION};
    private TextView txtPermissions;
    private Button btnCheckPermissions;
    private SharedPreferences permissionStatus;
    private boolean sentToSettings = false;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_multiple_permissions);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
 
        permissionStatus = getSharedPreferences("permissionStatus",MODE_PRIVATE);
 
        txtPermissions = (TextView) findViewById(R.id.txtPermissions);
        btnCheckPermissions = (Button) findViewById(R.id.btnCheckPermissions);
 
        btnCheckPermissions.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(ActivityCompat.checkSelfPermission(MultiplePermissionsActivity.this, permissionsRequired[0]) != PackageManager.PERMISSION_GRANTED
                        || ActivityCompat.checkSelfPermission(MultiplePermissionsActivity.this, permissionsRequired[1]) != PackageManager.PERMISSION_GRANTED
                        || ActivityCompat.checkSelfPermission(MultiplePermissionsActivity.this, permissionsRequired[2]) != PackageManager.PERMISSION_GRANTED){
                    if(ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[0])
                            || ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[1])
                            || ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[2])){
                        //Show Information about why you need the permission
                        AlertDialog.Builder builder = new AlertDialog.Builder(MultiplePermissionsActivity.this);
                        builder.setTitle("Need Multiple Permissions");
                        builder.setMessage("This app needs Camera and Location permissions.");
                        builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                                ActivityCompat.requestPermissions(MultiplePermissionsActivity.this,permissionsRequired,PERMISSION_CALLBACK_CONSTANT);
                            }
                        });
                        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        });
                        builder.show();
                    } else if (permissionStatus.getBoolean(permissionsRequired[0],false)) {
                        //Previously Permission Request was cancelled with 'Dont Ask Again',
                        // Redirect to Settings after showing Information about why you need the permission
                        AlertDialog.Builder builder = new AlertDialog.Builder(MultiplePermissionsActivity.this);
                        builder.setTitle("Need Multiple Permissions");
                        builder.setMessage("This app needs Camera and Location permissions.");
                        builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                                sentToSettings = true;
                                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                Uri uri = Uri.fromParts("package", getPackageName(), null);
                                intent.setData(uri);
                                startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
                                Toast.makeText(getBaseContext(), "Go to Permissions to Grant  Camera and Location", Toast.LENGTH_LONG).show();
                            }
                        });
                        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        });
                        builder.show();
                    }  else {
                        //just request the permission
                        ActivityCompat.requestPermissions(MultiplePermissionsActivity.this,permissionsRequired,PERMISSION_CALLBACK_CONSTANT);
                    }
 
                    txtPermissions.setText("Permissions Required");
 
                    SharedPreferences.Editor editor = permissionStatus.edit();
                    editor.putBoolean(permissionsRequired[0],true);
                    editor.commit();
                } else {
                    //You already have the permission, just go ahead.
                    proceedAfterPermission();
                }
            }
        });
    }
 
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == PERMISSION_CALLBACK_CONSTANT){
            //check if all permissions are granted
            boolean allgranted = false;
            for(int i=0;i<grantResults.length;i++){
                if(grantResults[i]==PackageManager.PERMISSION_GRANTED){
                    allgranted = true;
                } else {
                    allgranted = false;
                    break;
                }
            }
 
            if(allgranted){
                proceedAfterPermission();
            } else if(ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[0])
                    || ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[1])
                    || ActivityCompat.shouldShowRequestPermissionRationale(MultiplePermissionsActivity.this,permissionsRequired[2])){
                txtPermissions.setText("Permissions Required");
                AlertDialog.Builder builder = new AlertDialog.Builder(MultiplePermissionsActivity.this);
                builder.setTitle("Need Multiple Permissions");
                builder.setMessage("This app needs Camera and Location permissions.");
                builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                        ActivityCompat.requestPermissions(MultiplePermissionsActivity.this,permissionsRequired,PERMISSION_CALLBACK_CONSTANT);
                    }
                });
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
                builder.show();
            } else {
                Toast.makeText(getBaseContext(),"Unable to get Permission",Toast.LENGTH_LONG).show();
            }
        }
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_PERMISSION_SETTING) {
            if (ActivityCompat.checkSelfPermission(MultiplePermissionsActivity.this, permissionsRequired[0]) == PackageManager.PERMISSION_GRANTED) {
                //Got Permission
                proceedAfterPermission();
            }
        }
    }
 
    private void proceedAfterPermission() {
        txtPermissions.setText("We've got all permissions");
        Toast.makeText(getBaseContext(), "We got All Permissions", Toast.LENGTH_LONG).show();
    }
 
    @Override
    protected void onPostResume() {
        super.onPostResume();
        if (sentToSettings) {
            if (ActivityCompat.checkSelfPermission(MultiplePermissionsActivity.this, permissionsRequired[0]) == PackageManager.PERMISSION_GRANTED) {
                //Got Permission
                proceedAfterPermission();
            }
        }
    }
}

 

در متد onRequestPermissionsResult() ما از یک حلقه for برای شناسایی مجوزهای داده شده استفاده می کنیم.

مجوزهای درحال اجرا در اندروید

 

۳.۳-درخواست مجوز از Fragment

اکنون به قسمت درخواست مجوز از Fragment می رسیم.این روش متفاوتی است که می خواهیم به شما نشان دهیم. ما درخواست گرفتن وضیعت مجوز را از سیستم می کنیم(در واقع ما کاری نمی کنیم و تنها ما درخواست گرفتن مجوز ها را صادر می کنیم و مجوز های گرفته شده را نمایش می دهیم)
۱۱-یک اکتیویتی به نام FragmentPermissionActivity.java بسازید.موارد مورد نیاز را مقدار بدهید.
۱۲-دکمه btnLaunchPermissionFragment  را درون فایل MainActivity.java قسمت oncreate  مقداردهی کنید و کد های زیر را برای آن قرار دهید.

Button btnLaunchPermissionFragment = (Button) findViewById(R.id.btnLaunchPermissionFragment);
btnLaunchPermissionFragment.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       Intent intent = new Intent(MainActivity.this, FragmentPermissionActivity.class);
       startActivity(intent);
   }
});

 

۱۳-درون فایل AndroidManifest.xml مجوز زیر را اضافه کنید.

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

۱۴-فایل PermissionsFragment.java بازکنید و کد های زیر را در آن اصلاح کنید.

PermissionsFragment.java
package info.androidhive.mpermissions;
 
import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
 
import org.jetbrains.annotations.Nullable;
 
 
/**
* A placeholder fragment containing a simple view.
*/
public class PermissionsFragment extends Fragment {
 
 
   private static final int PERMISSION_CALLBACK_CONSTANT = 101;
   private static final int REQUEST_PERMISSION_SETTING = 102;
   private View view;
   private TextView txtPermissions;
   private Button btnCheckPermissions;
 
 
   
   private SharedPreferences permissionStatus;
   private boolean sentToSettings = false;
 
 
   public PermissionsFragment() {
   }
 
 
   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                            Bundle savedInstanceState) {
       return view = inflater.inflate(R.layout.fragment_permission, container, false);
   }
 
 
   @Override
   public void onActivityCreated(@Nullable Bundle savedInstanceState) {
       super.onActivityCreated(savedInstanceState);
 
 
       permissionStatus = getActivity().getSharedPreferences("permissionStatus",getActivity().MODE_PRIVATE);
 
 
       if(null != view){
           txtPermissions = (TextView) view.findViewById(R.id.txtPermissions);
           btnCheckPermissions = (Button) view.findViewById(R.id.btnCheckPermissions);
 
 
           btnCheckPermissions.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   if(ActivityCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
                       if(ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.READ_PHONE_STATE)){
                           //Show Information about why you need the permission
                           AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                           builder.setTitle("Need Permission");
                           builder.setMessage("This app needs phone permission.");
                           builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                               @Override
                               public void onClick(DialogInterface dialog, int which) {
                                   dialog.cancel();
                                   requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE},PERMISSION_CALLBACK_CONSTANT);
                               }
                           });
                           builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                               @Override
                               public void onClick(DialogInterface dialog, int which) {
                                   dialog.cancel();
                               }
                           });
                           builder.show();
                       } else if (permissionStatus.getBoolean(Manifest.permission.READ_PHONE_STATE,false)) {
                           //Previously Permission Request was cancelled with 'Dont Ask Again',
                           // Redirect to Settings after showing Information about why you need the permission
                           AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                           builder.setTitle("Need Permission");
                           builder.setMessage("This app needs storage permission.");
                           builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                               @Override
                               public void onClick(DialogInterface dialog, int which) {
                                   dialog.cancel();
                                   sentToSettings = true;
                                   Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                   Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null);
                                   intent.setData(uri);
                                   startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
                                   Toast.makeText(getActivity(), "Go to Permissions to Grant Phone", Toast.LENGTH_LONG).show();
                               }
                           });
                           builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                               @Override
                               public void onClick(DialogInterface dialog, int which) {
                                   dialog.cancel();
                               }
                           });
                           builder.show();
                       }  else {
                           //just request the permission
                           requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE},PERMISSION_CALLBACK_CONSTANT);
                       }
                       txtPermissions.setText("Permissions Required");
 
 
                       SharedPreferences.Editor editor = permissionStatus.edit();
                       editor.putBoolean(Manifest.permission.READ_PHONE_STATE,true);
                       editor.commit();
                   } else {
                       //You already have the permission, just go ahead.
                       proceedAfterPermission();
                   }
               }
           });
       }
   }
 
 
   private void proceedAfterPermission() {
       txtPermissions.setText("We've got all permissions");
       Toast.makeText(getActivity(), "We got All Permissions", Toast.LENGTH_LONG).show();
   }
 
 
   @Override
   public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       super.onRequestPermissionsResult(requestCode, permissions, grantResults);
       if(requestCode == PERMISSION_CALLBACK_CONSTANT){
           //check if all permissions are granted
           boolean allgranted = false;
           for(int i=0;i<grantResults.length;i++){
               if(grantResults[i]==PackageManager.PERMISSION_GRANTED){
                   allgranted = true;
               } else {
                   allgranted = false;
                   break;
               }
           }
 
 
           if(allgranted){
               proceedAfterPermission();
           } else if(ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.READ_PHONE_STATE)){
               txtPermissions.setText("Permissions Required");
               AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
               builder.setTitle("Need Storage Permission");
               builder.setMessage("This app needs phone permission.");
               builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {
                       dialog.cancel();
                       requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE},PERMISSION_CALLBACK_CONSTANT);
                   }
               });
               builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {
                       dialog.cancel();
                   }
               });
               builder.show();
           } else {
               Toast.makeText(getActivity(),"Unable to get Permission",Toast.LENGTH_LONG).show();
           }
       }
   }
 
 
   @Override
   public void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
       if (requestCode == REQUEST_PERMISSION_SETTING) {
           if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
               //Got Permission
               proceedAfterPermission();
           }
       }
   }
 
 
   @Override
   public void onResume() {
       super.onResume();
 
 
       if (sentToSettings) {
           if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
               //Got Permission
               proceedAfterPermission();
           }
       }
   }
}

 

آموزش مجوزهای در حال اجرا در اندروید M

 

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


محصولات مشابه

تومان