সিকিউরিটি এক্সসেপশন না ছুটে রানটাইম এ অনুমতি কীভাবে চেক করা যায়?


94

আমি এমন একটি ফাংশন ডিজাইন করেছি যা এসডি থেকে কোনও সংস্থান পেতে / সেট করতে পারে এবং এসডি থেকে পাওয়া না গেলে এটি এসেট থেকে নেওয়া এবং সম্ভব হলে এসডিটি আবার এসডিতে লিখুন
এই ফাংশনটি এসডি মাউন্ট করা এবং অ্যাক্সেসযোগ্য হলে পদ্ধতি অনুরোধের মাধ্যমে পরীক্ষা করতে পারে ...

boolean bSDisAvalaible = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);

আমার নকশা করা ফাংশনটি একটি অ্যাপ্লিকেশন (প্রকল্প) থেকে অন্যটিতে (android.permission সহ বা ছাড়াই ব্যবহার করা যেতে পারে W

তারপরে আমি সিকিউরিটিএক্সসেপশন না খেললে বর্তমান অ্যাপ্লিকেশনটির এই বিশেষ অনুমতি আছে কিনা তা পরীক্ষা করে দেখতে চাই।

রানটাইমে বর্তমান সংজ্ঞায়িত অনুমতিগুলির সাথে পরামর্শ করার কোনও "সুন্দর" উপায় কি বিদ্যমান?

উত্তর:


197

আপনি Context.checkCallingorSelfPermission()এই জন্য ফাংশন ব্যবহার করতে পারেন । এখানে একটি উদাহরণ:

private boolean checkWriteExternalPermission()
{
    String permission = android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
    int res = getContext().checkCallingOrSelfPermission(permission);
    return (res == PackageManager.PERMISSION_GRANTED);            
}

এই পদ্ধতিটি একটি সুরক্ষা ঝুঁকি উপস্থাপন করতে পারে।
তালমহির

13
@ টালমিহর আপনি কেন বিশ্বাস করেন `চেক কলিংঅরএসফল্ট পার্মিশন () 'সুরক্ষা ঝুঁকিপূর্ণ?
উইলিয়াম

4
না। রানটাইমে আপনি নিজেকে অনুমতি দিতে পারবেন না।
অনুবিয়ান নুব

4
পদ্ধতির checkCallingPermission()পরিবর্তে ব্যবহার করা ভাল checkCallingOrSelfPermission()
hasanghaforian

9
এখন এটির জন্য একটি কোম্যাটিবিলিটি মোড়ক রয়েছে: কনটেক্সটকম্প্যাট
সিচেকসেল্প

51

এটি পাশাপাশি আরও একটি সমাধান

PackageManager pm = context.getPackageManager();
int hasPerm = pm.checkPermission(
    android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 
    context.getPackageName());
if (hasPerm != PackageManager.PERMISSION_GRANTED) {
   // do stuff
}

সুতরাং আমি ঠিক এই কোডটি মোড়ানো উচিত বিবৃতি যদি? অডিওটি নিঃশব্দ করার জন্য ব্যবহারকারী কোনও কল পাচ্ছেন, বা কোনও কল করছেন কিনা তা দেখার জন্য আমি এটি করেছি: snag.gy/uIxsv.jpg
রুচির

অনুমতি বা আইপিসির জন্য প্যাকেজ কল করার মধ্যে কোন পার্থক্য রয়েছে?
htafoya

4
আপনাকে অনেক ধন্যবাদ, খুব সহায়ক। অ্যান্ড্রয়েড 5.1.1 এ একটি কবজির মতো কাজ করে। আপনি যদি এখনও "প্রসঙ্গ" সংজ্ঞায়িত না করেন তবে আপনি "getBaseContext ()" এর সাথে "প্রসঙ্গ" প্রতিস্থাপন করতে পারেন।
জ্যামিসনম্যান 111

19

আপনি এটি ব্যবহার করতে পারেন:

private boolean doesUserHavePermission()
{
    int result = context.checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
    return result == PackageManager.PERMISSION_GRANTED;
}


8

কারও যদি প্রয়োজন হয় সে ক্ষেত্রে আমার পদ্ধতিগুলি ভাগ করে নেওয়া:

 /** Determines if the context calling has the required permission
 * @param context - the IPC context
 * @param permissions - The permissions to check
 * @return true if the IPC has the granted permission
 */
public static boolean hasPermission(Context context, String permission) {

    int res = context.checkCallingOrSelfPermission(permission);

    Log.v(TAG, "permission: " + permission + " = \t\t" + 
    (res == PackageManager.PERMISSION_GRANTED ? "GRANTED" : "DENIED"));

    return res == PackageManager.PERMISSION_GRANTED;

}

/** Determines if the context calling has the required permissions
 * @param context - the IPC context
 * @param permissions - The permissions to check
 * @return true if the IPC has the granted permission
 */
public static boolean hasPermissions(Context context, String... permissions) {

    boolean hasAllPermissions = true;

    for(String permission : permissions) {
        //you can return false instead of assigning, but by assigning you can log all permission values
        if (! hasPermission(context, permission)) {hasAllPermissions = false; }
    }

    return hasAllPermissions;

}

এবং এটি কল করতে:

boolean hasAndroidPermissions = SystemUtils.hasPermissions(mContext, new String[] {
                android.Manifest.permission.ACCESS_WIFI_STATE,
                android.Manifest.permission.READ_PHONE_STATE,
                android.Manifest.permission.ACCESS_NETWORK_STATE,
                android.Manifest.permission.INTERNET,
        });

6

আপনাকে নিম্নলিখিত উপায়ে অনুমতিগুলি পরীক্ষা করা উচিত (এখানে অ্যান্ড্রয়েড অনুমতিগুলি বর্ণিত হিসাবে ):

int result = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_PHONE_STATE);

তারপরে, আপনার ফলাফলের সাথে তুলনা করুন:

result == PackageManager.PERMISSION_DENIED

বা:

result == PackageManager.PERMISSION_GRANTED

ধন্যবাদ এটি সহায়ক ছিল।
সুধীর খঙ্গার

3

পদক্ষেপ 1 - অনুমতি অনুরোধ যোগ করুন

    String[] permissionArrays = new String[]{Manifest.permission.CAMERA, 
    Manifest.permission.WRITE_EXTERNAL_STORAGE};
    int REQUEST_CODE = 101;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(permissionArrays, REQUEST_CODE );
        } else {
             // if already permition granted
            // PUT YOUR ACTION (Like Open cemara etc..)
        }
    }

পদক্ষেপ 2 - অনুমতি ফলাফল হ্যান্ডেল

     @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    boolean openActivityOnce = true;
    boolean openDialogOnce = true;
    if (requestCode == REQUEST_CODE ) {
        for (int i = 0; i < grantResults.length; i++) {
            String permission = permissions[i];

            isPermitted = grantResults[i] == PackageManager.PERMISSION_GRANTED;

            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                // user rejected the permission

            }else {
                //  user grant the permission
                // you can perfome your action 
            }
        }
    }
}

2

কোডটি আমার পক্ষে ভাল কাজ করে: -

  final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 102;
  if ((ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {

                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
            } else {
        // user already provided permission
                // perform function for what you want to achieve
     }

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    boolean canUseExternalStorage = false;

    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                canUseExternalStorage = true;
            }

            if (!canUseExternalStorage) {
                Toast.makeText(getActivity(), "Cannot use this feature without requested permission", Toast.LENGTH_SHORT).show();
            } else {
                // user now provided permission
                // perform function for what you want to achieve
            }
        }
      }
 }

1

কোটলিনে (রানটাইম) অনুমতি পরীক্ষা করুন

ম্যানিফেস্টে: (Android.permission.WRITE_EXTERNAL_STORAGE

    fun checkPermissions(){

      var permission_array=arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
      if((ContextCompat.checkSelfPermission(this,permission_array[0]))==PackageManager.PERMI   SSION_DENIED){
        requestPermissions(permission_array,0)
      }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)

          if(requestCode==0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){

       //Do Your Operations Here

        ---------->
         //


          }
    }

0

জিপিএস অবস্থান অ্যান্ড্রয়েড স্টুডিও সক্ষম করুন

  1. AndroidManLive.XML এ অনুমতি প্রবেশ করুন

  1. মানচিত্রঅ্যাক্টিভিটি.জভা

    public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    
    private GoogleMap mMap;
    private Context context;
    private static final int PERMISSION_REQUEST_CODE = 1;
    Activity activity;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        context = getApplicationContext();
        activity = this;
        super.onCreate(savedInstanceState);
        requestPermission();
        checkPermission();
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    
    }
    
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        LatLng location = new LatLng(0, 0);
        mMap.addMarker(new MarkerOptions().position(location).title("Marker in Bangalore"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(location));
        mMap.setMyLocationEnabled(true);
    }
    
    private void requestPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION)) {
            Toast.makeText(context, "GPS permission allows us to access location data. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_CODE);
        }
    }
    
    private boolean checkPermission() {
        int result = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
        if (result == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            return false;
        }
    }
    

0
if ((ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA},
                MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
    }
} 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.