READ_EXTERNAL_STORAGE অ্যান্ড্রয়েডের অনুমতি


84

আমি তাদের প্লে করতে ব্যবহারকারীদের ডিভাইসে মিডিয়া ফাইলগুলি (সঙ্গীত) অ্যাক্সেস করার চেষ্টা করছি; একটি সহজ "হ্যালো ওয়ার্ল্ড"-মিউজিক প্লেয়ার অ্যাপ্লিকেশন।

আমি কিছু টিউটোরিয়াল অনুসরণ করেছি এবং তারা মূলত একই কোড দেয়। তবে এটি কাজ করবে না; এটি ক্র্যাশ করে এবং আমাকে বলে রাখে:

error.....
Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=27696, uid=10059 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
....

এখন, এটি আমার প্রকাশ্য ফাইল:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="slimsimapps.troff" >

    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


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

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
</manifest>

এটি আমার জাভা পদ্ধতি:

public void initialize() {
    ContentResolver contentResolver = getContentResolver();
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor cursor = contentResolver.query(uri, null, null, null, null);
    if (cursor == null) {
        // query failed, handle error.
    } else if (!cursor.moveToFirst()) {
        // no media on the device
    } else {
        do {
            addSongToXML(cursor);
        } while (cursor.moveToNext());
    }
}

আমি চেষ্টা করেছি:

ম্যানিফেস্ট ফাইলটিতে এটি বিভিন্ন স্থানে রাখতে:

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

অ্যান্ড্রয়েড যুক্ত করতে: বাহ্যিক স্টোরেজ প্রিমন পড়ুন এ ম্যাক্সএসডিকি ভার্সন:

<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="21" />

এটিকে ম্যানিফেস্ট / অ্যাপ্লিকেশন / ক্রিয়াকলাপ-ট্যাগে রাখার জন্য:

android:exported=“true

জাভেমথোডিতে ইউরি এবং কার্স্রোর মধ্যে অনুদানপ্রদানের জন্য:

grantUriPermission(null, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

এটি ব্যবহার করতে, এটি ক্রাশ হবে না, তবে কার্সারটি বাতিল হয়ে যাবে:

uri = MediaStore.Audio.Media.getContentUri("EXTERNAL_CONTENT_URI”);

অভ্যন্তরীণ সামগ্রী ইউরি ব্যবহার করতে, এটি প্রত্যাশার মতো কাজ করে তবে এটি কেবল "ওএস-সাউন্ডস" যেমন শাটার-সাউন্ড, লো-ব্যাটারি-সাউন্ড, বোতাম-ক্লিক এবং এই জাতীয়:

uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;

প্লিজ সহায়তা, আমার জানা সমস্যাটি এমন হওয়া উচিত নয়, তবে আমি এইরকম একজন নবজাতকের মতো অনুভব করি!

আমি পড়েছি এবং চেষ্টা করেছি (বা এগুলি আমার সমস্যার জন্য প্রযোজ্য নয়) considered

স্ট্যাক ট্রেস:

09-08 06:59:36.619    2009-2009/slimsimapps.troff D/AndroidRuntime﹕ Shutting down VM
    --------- beginning of crash
09-08 06:59:36.619    2009-2009/slimsimapps.troff E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: slimsimapps.troff, PID: 2009
    java.lang.IllegalStateException: Could not execute method for android:onClick
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4452)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=2009, uid=10059 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
            at android.os.Parcel.readException(Parcel.java:1599)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
            at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
            at android.content.ContentResolver.query(ContentResolver.java:491)
            at android.content.ContentResolver.query(ContentResolver.java:434)
            at slimsimapps.troff.MainActivity.initialize(MainActivity.java:106)
            at slimsimapps.troff.MainActivity.InitializeExternal(MainActivity.java:80)
            at java.lang.reflect.Method.invoke(Native Method)
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    --------- beginning of system

আপনি যখন এই লাইনটি ম্যানিফেস্ট <ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "android.permission.READ_EXTERNAL_STORAGE" /> এ না দিয়েছেন তখন অদ্ভুত ত্রুটিটি প্রদর্শিত হয় আপনি কি কিছু ফাইল পড়ার চেষ্টা করছেন যা কিছু অন্যান্য অ্যাপ্লিকেশন দ্বারা সুরক্ষিত?
রোদ রোদ

আপনি কোন এপি স্তরে এটি চেষ্টা করছেন?
ধারালো এজ

আপনি কি প্রকল্পটি পরিষ্কার করার চেষ্টা করেছিলেন? ?
রোদ রোদ

@ সুনিলসুন্নি আমি সুরক্ষিত সোম ফাইলগুলি পড়ার চেষ্টা করছি না, তবে আমি জানি না যে, কেবল একটি সাধারণ মিডিয়া প্লেয়ার। হ্যাঁ, আমি এটি পরিষ্কার করার চেষ্টা করেছি, আমি কম্পিউটার পুনরায় চালু করার চেষ্টা করেছি, আমি একটি স্বাক্ষরিত এপিপি তৈরি করার চেষ্টা করেছি এবং এটি গুগল প্লেতে প্রকাশ করার চেষ্টা করেছি এবং কোনও পরীক্ষার্থী হিসাবে এটি পরীক্ষক হিসাবে অ্যাক্সেস করেছি ....
স্লিম সিম

@ধারালো প্রান্ত ; আমার AVD মান নেক্সাস 5 হয়, API 23 আমার মডিউল gradle রয়েছে: compileSdkVersion 23 buildToolsVersion "23.0.0" minSdkVersion 14 targetSdkVersion 23 তাই আমি বলতে হবে 23
স্লিম সিম

উত্তর:


90

আপনার সমস্যার জন্য দুটি সমাধান রয়েছে। দ্রুততমটি হ'ল টার্গেটএপি 22 থেকে কমিয়ে আনুন (বিল্ড.gradle ফাইল)। দ্বিতীয়টি হ'ল নতুন এবং দুর্দান্ত-অনুরোধের জন্য অনুমতি মডেলটি ব্যবহার করুন:

if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (shouldShowRequestPermissionRationale(
            Manifest.permission.READ_EXTERNAL_STORAGE)) {
        // Explain to the user why we need to read the contacts
    }

    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
    // app-defined int constant that should be quite unique

    return;
}

স্নিপলেট এখানে পাওয়া গেছে: https://developer.android.com/training/permission/requesting.html

সমাধান 2: যদি এটি কাজ না করে তবে এটি চেষ্টা করে দেখুন:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
    && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
        REQUEST_PERMISSION);

return;

}

এবং তারপরে কলব্যাকে

@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION) {
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // Permission granted.
    } else {
        // User refused to grant permission.
    }
}
}

এটা মন্তব্য থেকে। ধন্যবাদ


4
হ্যা অবশ্যই! সর্বশেষতম অ্যান্ড্রয়েডের সাথে গুগল নতুন অনুমতি মডেল চালু করেছে! আপনাকে ধন্যবাদ, আমি যত তাড়াতাড়ি সম্ভব এটি পরীক্ষা করব এবং এটি কার্যকর হলে এটি চিহ্নিত করব! (এবং আমি ভাবতে শুরু করেছিলাম এটি ভুলে গেছে!)
স্লিম সিম

4
অনুমতি যে অনুরোধ করা হচ্ছে হওয়া উচিত READ_EXTERNAL_STORAGE। মত এই উত্তর
malpir

! swap 'র = PackageManager.READ_EXTERNAL_STORAGE জন্য = PackageManager.PERMISSION_GRANTED!
Renascienza

4
@ রেনাসিয়েনজা, হ্যাঁ আপনি ঠিক বলেছেন। কেউ এই উত্তরটি ভুল উপায়ে সম্পাদনা করেছেন।
পিয়োটারপো

4
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE কি?
একক

17

রান চলাকালীন আপনাকে অনুমতি চাইতে হবে:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
        && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            REQUEST_PERMISSION);
    dialog.dismiss();
    return;
}

এবং নীচের কলব্যাকে আপনি কোনও সমস্যা ছাড়াই স্টোরেজ অ্যাক্সেস করতে পারবেন।

@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission granted.
        } else {
            // User refused to grant permission.
        }
    }
}

7

পদক্ষেপ 1: অ্যান্ড্রয়েড ম্যানেজমেন্ট.এক্সএমএলে অনুমতি যুক্ত করুন

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

পদক্ষেপ 2: অনক্রিট () পদ্ধতি

int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_MEDIA);
    } else {
        readDataExternal();
    }

স্টিপি 3: কলব্যাক পেতে ওভাররাইডRequestPermissionResult পদ্ধতি

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_MEDIA:
            if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                readDataExternal();
            }
            break;

        default:
            break;
    }
}

দ্রষ্টব্য: পঠন ডেটাএক্সটার্নাল () হ'ল বাহ্যিক স্টোরেজ থেকে ডেটা পাওয়ার পদ্ধতি।

ধন্যবাদ


4
আমি মনে করি আপনি এখানে প্রয়োজনীয় অনুমতিটি ভুল জায়গায় স্থান দিয়েছেন: এটি READ_EXTERNAL_STORAGE।
রেনাসিয়েনজা

4

আমারও অনুরূপ ত্রুটিযুক্ত লগ ছিল এবং আমি এখানে যা করেছি-

  1. অনক্রিয়েট পদ্ধতিতে আমরা অনুমতিগুলি পরীক্ষা করার জন্য একটি ডায়ালগ বক্সের জন্য অনুরোধ করি

    ActivityCompat.requestPermissions(MainActivity.this,
    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
    
  2. ফলাফলটি পরীক্ষা করার পদ্ধতি

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission granted and now can proceed
             mymethod(); //a sample method called
    
            } else {
    
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
            return;
        }
        // add other cases for more permissions
        }
    }
    

রানটাইম অনুমতিগুলির জন্য অনুরোধ করার অফিসিয়াল ডকুমেন্টেশন


4
আমি এটি ব্যবহার করেছি এবং এটি পুরোপুরি কাজ করেছে এটি কি সমস্ত অ্যান্ড্রয়েড ডিভাইসে কাজ করে?
মাহদী হরবি

1

আপনার সমস্যার সমাধান হয়েছে? আপনার লক্ষ্য এসডিকে কী? যোগ android;maxSDKVersion="21"করার চেষ্টা করুন<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


কর্ডোভা ব্যবহার করে আমার জন্য কাজ করেছেন, কেবলমাত্র AndroidManLive.xML- এ সর্বাধিক SDK সংস্করণ 22 (23 এর পরিবর্তে) সেট করে
জর্জ কাগান

0

http://developer.android.com/references/android/provider/MediaStore.Audio.Audio Columns.html

লাইনটি পরিবর্তন করার চেষ্টা করুন contentResolver.query

//change it to the columns you need
String[] columns = new String[]{MediaStore.Audio.AudioColumns.DATA}; 
Cursor cursor = contentResolver.query(uri, columns, null, null, null);

সর্বজনীন স্ট্যাটিক চূড়ান্ত স্ট্রিং MEDIA_CONTENT_CONTROL

মিডিয়া ব্যবহারের গোপনীয়তার কারণে তৃতীয় পক্ষের অ্যাপ্লিকেশন দ্বারা ব্যবহারের জন্য নয়

http://developer.android.com/references/android/ManLive.permission.html#MEDIA_CONTENT_CONTROL

<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>প্রথমটি অপসারণ করার চেষ্টা করুন এবং আবার চেষ্টা করুন?


ধন্যবাদ, আমি আপনার পরামর্শটি চেষ্টা করেছি কিন্তু এটি একই জায়গায় ক্র্যাশ হয়ে গেছে ... আমি একটি ম্যাক ব্যবহার করছি, এটি কি সমস্যা হতে পারে?
স্লিম সিম

আপডেট হয়েছে, অপসারণ <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>এবং চেষ্টা চেষ্টা? এটি অদ্ভুত আচরণ তৈরি করতে পারে কারণ আপনার অ্যাপ্লিকেশনটির অনুরোধের অনুমতি নেই
ডেরেক ফুং

ধন্যবাদ, আমি সেই অনুমতিটি সরিয়ে দেওয়ার চেষ্টা করেছি, তবে একই ত্রুটির সাথে একই জায়গায় ক্র্যাশ হয়ে গেছে ...
স্লিম সিম

0

দয়া করে নীচে কোডটি দেখুন যা ব্যবহার করে আপনি এসডকার্ড থেকে সমস্ত মিউজিক ফাইলগুলি সন্ধান করতে পারেন:

public class MainActivity extends Activity{

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

}

public void getAllSongsFromSDCARD() {
    String[] STAR = { "*" };
    Cursor cursor;
    Uri allsongsuri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

    cursor = managedQuery(allsongsuri, STAR, selection, null, null);

    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                String song_name = cursor
                        .getString(cursor
                                .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
                int song_id = cursor.getInt(cursor
                        .getColumnIndex(MediaStore.Audio.Media._ID));

                String fullpath = cursor.getString(cursor
                        .getColumnIndex(MediaStore.Audio.Media.DATA));

                String album_name = cursor.getString(cursor
                        .getColumnIndex(MediaStore.Audio.Media.ALBUM));
                int album_id = cursor.getInt(cursor
                        .getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

                String artist_name = cursor.getString(cursor
                        .getColumnIndex(MediaStore.Audio.Media.ARTIST));
                int artist_id = cursor.getInt(cursor
                        .getColumnIndex(MediaStore.Audio.Media.ARTIST_ID));
                System.out.println("sonng name"+fullpath);
            } while (cursor.moveToNext());

        }
        cursor.close();
    }
}


}

আমি নীচের হিসাবে অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ফাইলে নিম্নলিখিত লাইনটি যুক্ত করেছি:

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

ধন্যবাদ, আমি এর আগেও কিছু অনুরূপ চেষ্টা করেছি, তবে আমি আপনার কোডটি চেষ্টা করেছিলাম এবং এটি "কার্সার = ম্যানেজড কুইচারি (অলসংসুরি, স্টার, নির্বাচন, নাল, নাল);", আগের মতো একই ত্রুটি। যাইহোক; পরিচালিত জিজ্ঞাসা হ্রাস করা হয়, তবে আমি যদি এটিকে "কন্টেন্টসেসলভার.কোয়ারী" তে পরিবর্তন করি তবে এটি ক্রাশ হয়ে যায়, যার একই ইনপুট প্যারামিটার রয়েছে ...
স্লিম সিম

হাই, আমি উপরের কোড ব্যবহার করে সমস্ত এসডক্যাডার গান পেতে সক্ষম হয়েছি। অ্যান্ড্রয়েড সংস্করণ 4.2.2 ডিভাইস সহ এবং সংস্করণ 5.0.2 এর সাথে সক্ষম। যা আপনি চেষ্টা করছেন। আপনি কী ত্রুটি পেয়েছেন দয়া করে অ্যান্ড্রয়েড সংস্করণ দিয়ে বর্ণনা করুন
রাজন ভাবসার

আমি স্ট্যাক-ট্রেস দিয়ে প্রশ্নটি আপডেট করেছি, আশা করি এটি সাহায্য করবে। অ্যান্ড্রয়েড সংস্করণ দিয়ে আপনি কী বোঝাতে চাইছেন? (আমি এপিপি 23 ব্যবহার করছি)
স্লিম সিম

ঠিক আছে আমাকে পুরো উত্স কোড দিন এবং এটি আবার চেক আউট করি।
রাজন ভাবসার

আপনি যদি নিজের জন্য পরীক্ষা করতে চান তবে জিপটি এখানে ডাউনলোড করুন: drive.google.com/open?id=0B2AV8VRk9HUeVzFXSWVRZU9TRUk এটি চালানোর সময়, ক্র্যাশ তৈরির জন্য বাম সূচনা-বোতাম টিপুন।
স্লিম সিম

0

সমস্ত উত্তর ছাড়াও। আপনি এই টীকাটি সহ প্রয়োগ করতে মিনিসডিকে নির্দিষ্ট করতে পারেন

@TargetApi(_apiLevel_)

আমি এই অনুরোধটি এমনকি আমার minsdk 18 বছর স্বীকার করার জন্য ব্যবহার করেছি What এটি কী করে যে পদ্ধতিটি কেবল তখনই চালিত হয় যখন ডিভাইস "_apilevel_" এবং উপরের লক্ষ্যবস্তু হয়। আমার পদ্ধতিটি এখানে:

    @TargetApi(23)
void solicitarPermisos(){

    if (ContextCompat.checkSelfPermission(this,permiso)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (shouldShowRequestPermissionRationale(
                Manifest.permission.READ_EXTERNAL_STORAGE)) {
            // Explain to the user why we need to read the contacts
        }

        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                1);

        // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
        // app-defined int constant that should be quite unique

        return;
    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.