অ্যান্ড্রয়েড অনুমতি ঘোষণা করলেও এটি কাজ করে না


167

আমি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন থেকে এসএমএস প্রেরণের জন্য কোডটি লেখার চেষ্টা করছি, কিন্তু আমি যখন এসএমএস পাঠানোর চেষ্টা করি তখন এটি আমাকে ত্রুটিটি ফিরে পাঠায়:

09-17 18:37:29.974  12847-12847/**.**.****E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: **.**.****, PID: 12847
java.lang.SecurityException: Sending SMS message: uid 10092 does not have android.permission.SEND_SMS.
        at android.os.Parcel.readException(Parcel.java:1599)
        at android.os.Parcel.readException(Parcel.java:1552)
        at com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:768)
        at android.telephony.SmsManager.sendTextMessageInternal(SmsManager.java:310)
        at android.telephony.SmsManager.sendTextMessage(SmsManager.java:293)
        at **.**.****.MainActivity$3.onClick(MainActivity.java:70)
        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)

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

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-feature android:name="android.hardware.telephony"
    android:required="true"/>

<application
    android:exported="true"
    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"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

আমি ইন্টারনেট অনুসন্ধান করেছি কিন্তু সমস্ত ত্রুটিগুলি <uses-permission/>সিনট্যাক্স সম্পর্কে ছিল , আপনি কি আমাকে সাহায্য করতে পারেন?


অ্যান্ড্রয়েডের কোন সংস্করণ আপনি পরীক্ষা করছেন?
CommonsWare

আমি অ্যান্ড্রয়েড 6.0
নাথন লাউডজানি

1
অবশ্যই এটি অ্যান্ড্রয়েডের নীচের সংস্করণে কাজ করবে। অ্যান্ড্রয়েড 6.0
ফখের

অ্যান্ড্রয়েড 6 এর জন্য একটি বিশেষ সিনট্যাক্স আছে? এটি কীভাবে নিশ্চিত যে এটি নীচের সংস্করণে কাজ করে?
নাথান লাউডজানি

অ্যাপ্লিকেশন আপডেটের অনুমতি না নিয়ে কাজ করার পরে আমার পূর্ববর্তীটি আপডেট targetsdkversionহয়েছিল যা ইতিমধ্যে সক্ষম। দয়া করে সহায়তা করুন2327READ_SMS
সাগর

উত্তর:


237

(নিম্নলিখিতটি সম্পর্কে আমার একটি ব্লগ পোস্ট থেকে নেওয়া হয়েছে )

আজকাল আপনার অনুমতি না পাওয়ার বড় কারণ হ'ল আপনার প্রকল্পের targetSdkVersion23 বা ততোধিক বর্ধমান রয়েছে এবং আপনি যে অনুমতিটির জন্য অনুরোধ করছেন সেটি "বিপজ্জনক"। অ্যান্ড্রয়েড .0.০ এ এর ​​মধ্যে রয়েছে:

  • ACCESS_COARSE_LOCATION
  • ACCESS_FINE_LOCATION
  • ADD_VOICEMAIL
  • BODY_SENSORS
  • CALL_PHONE
  • CAMERA
  • GET_ACCOUNTS
  • PROCESS_OUTGOING_CALLS
  • READ_CALENDAR
  • READ_CALL_LOG
  • READ_CELL_BROADCASTS
  • READ_CONTACTS
  • READ_EXTERNAL_STORAGE
  • READ_PHONE_STATE
  • READ_SMS
  • RECEIVE_MMS
  • RECEIVE_SMS
  • RECEIVE_WAP_PUSH
  • RECORD_AUDIO
  • SEND_SMS
  • USE_SIP
  • WRITE_CALENDAR
  • WRITE_CALL_LOG
  • WRITE_CONTACTS
  • WRITE_EXTERNAL_STORAGE

এই অনুমতির জন্য না শুধুমাত্র তোমার চলে targetSdkVersionআছে 23+ অ্যাপ্লিকেশানটি প্রয়োজন <uses-permission>উপাদান (গুলি), কিন্তু আপনি, অ্যান্ড্রয়েড 6.0+ ডিভাইসের ব্যবহারকারী থেকে রানটাইম যাদের অনুমতির জন্য অনুরোধ মত পদ্ধতি ব্যবহার করে আছে checkSelfPermission()এবং requestPermissions()

অস্থায়ী কর্মক্ষেত্র হিসাবে, আপনার targetSdkVersionনীচের 23 টি বাদ দিন ।

যাইহোক, অবশেষে, আপনার নিজের targetSdkVersion23 বা তার চেয়ে বেশি হওয়ার জন্য কিছু কারণ থাকতে হবে। সেই সময়, নতুন রানটাইম অনুমতি সিস্টেমটি ব্যবহার করার জন্য আপনার অ্যাপ্লিকেশনটি সামঞ্জস্য করতে হবে। অ্যান্ড্রয়েড ডকুমেন্টেশনের এই বিষয়টিতে উত্সর্গীকৃত একটি পৃষ্ঠা রয়েছে ।


2
আপনাকে অনেক ধন্যবাদ, আমি
অনুরোধের অনুরোধগুলি

ঠিক আছে, আমি এর আগেও চেষ্টা করেছি কিন্তু কনটেক্সটকম্প্যাট.সেকপ সেলফার পার্মিশন এবং অ্যাক্টিভিটিকম্প্যাট.রেকস্ট পার্মিশন পদ্ধতিগুলি না পেয়ে তারা আমাকে পদ্ধতির নামগুলিতে 'খুঁজে পাওয়া যায় না' ত্রুটি দেয়। অনুমান করছি এটি অনুপস্থিত লাইব্রেরির সাথে করা, এটি কোনও ভি 4 প্যাকেজে রয়েছে বলে মনে হচ্ছে তবে আমার একমাত্র গ্রেড নির্ভরতা compile 'com.android.support:appcompat-v7:22.2.1'। আমি কি এটি v4 এ পরিবর্তন করব?
ওজি

2
@ ওজি: আপনি বর্তমানে ব্যবহৃত ভি 22-র পরিবর্তে আপনার সমর্থন লাইব্রেরির v23 প্রজন্মের ( 23.x.yx এবং y এর বর্তমান মানের জন্য) থাকা উচিত।
কমন্সওয়্যার

ধন্যবাদ, ভবিষ্যতের জন্য আমি অনুমান করি। আপাতত আমি লক্ষ্যটিকে আবার ভি 22 এ পরিবর্তন করেছি এবং এসিডি কার্ড স্টোরেজটি এমুলেটরটিতে 200 এমবিতে সেট করা হলেও এটি আমাকে এসডি কার্ডে ত্রুটিযুক্ত নয় gave তবে তারপরে আমি আমার ফোনটিকে বিকাশকারী মোডে সংযুক্ত করেছি এবং সমস্ত কিছু কাজ করে। কোনও কারণে এসডি কার্ড স্টোরেজটি এমুলেটরে v23 চালিত না হলেও চলমান।
ওজি

3
@ নাথান লাউদজনী আপনার কোডটি ভাগ করে নিতে ইচ্ছে করে যা এটি প্রয়োগ করে? আমি ঠিক একই নৌকায় আছি এবং এটিকে আমার ক্রিয়াকলাপে রাখার জন্য লড়াই করছি।
ডিসসুয়েট

29

এপিআই স্তরের 23 এর উপরে আপনাকে প্রোগ্রামগতভাবে ব্যবহারিকভাবে দেওয়া হবে:

    private static final int PERMISSION_REQUEST_CODE = 1;

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

        if (checkSelfPermission(Manifest.permission.SEND_SMS)
                == PackageManager.PERMISSION_DENIED) {

            Log.d("permission", "permission denied to SEND_SMS - requesting it");
            String[] permissions = {Manifest.permission.SEND_SMS};

            requestPermissions(permissions, PERMISSION_REQUEST_CODE);

        }
    }

7

ব্যবহারিকভাবে অনুমতি অনুরোধ (এপিআই 23 পরে)

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.SEND_SMS)
    != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted 
    // Ask for permision
    ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.SEND_SMS}, 1); 
} 
else {
// Permission has already been granted
}

"যদি অ্যাপ্লিকেশানের অনুমতি থাকে তবে পদ্ধতিটি চেকসেলফ সেলফর্মেশন () PERMISSION_GRANTED প্রদান করে এবং অ্যাপটি ক্রিয়াকলাপটি নিয়ে এগিয়ে যেতে পারে।

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


আমরা এই লাইনটি কোথায় রাখব? ক্রিয়াকলাপম্পট.আরএকুয়েস্টপ্রেরেশনস (এটি, নতুন স্ট্রিং [] {Manifest.permission.SEND_SMS}, 1); এবং 1 কী বোঝায়?
LizG


6

আপনি যখন ঘোষণা permissonকরেন Manifestএবং এটি কাজ করে না তার অর্থ আপনি কার্য সম্পাদন করছেন MarshMallowএবং আপনার জন্য MarshMallowপার্মিসন সেট করেছেন RunTime

এই মত

ActivityCompat.requestPermissions();

6

দয়া করে নীচের লিঙ্কটি দিয়ে যান, https://developer.android.com/guide/topics/permitted/overview.html

অনুমতিগুলি শুরু করার জন্য কিছু নমুনাও সেখানে উপলব্ধ।

অ্যান্ড্রয়েডকে আরও সুরক্ষিত করতে এখন বিকাশকারীদের ম্যানিফেস্টে অনুমতি উল্লেখ করতে হবে পাশাপাশি তাদের কাজটি চালানোর জন্য ব্যবহারকারীদের পাশাপাশি রান সময়ও জিজ্ঞাসা করতে হবে। তারা বিপজ্জনক অনুমতি বিভাগে শ্রেণিবদ্ধ অনুমতি যা নীচে উল্লেখ করা হয়

ক্যালেন্ডার

READ_CALENDAR

WRITE_CALENDAR

ক্যামেরা

CAMERA

পরিচিতি

READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS

অবস্থান

ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION

মাইক

RECORD_AUDIO

ফোন

READ_PHONE_STATE
READ_PHONE_NUMBERS
CALL_PHONE
ANSWER_PHONE_CALLS (must request at runtime)
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
ANSWER_PHONE_CALLS

সেন্সর

BODY_SENSORS

খুদেবার্তা

SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS

সঞ্চয়স্থান

READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

2

আমি এটিকে আমার মূল কার্যকলাপে যুক্ত করেছি, যা আমার সমস্যার সমাধান করে

       int MY_PERMISSIONS_REQUEST_READ_CONTACTS=0;
// Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

                // Show an expanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

            } else {

                // No explanation needed, we can request the permission.

                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_READ_CONTACTS);

                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }

2

আপনি যদি অ্যান্ড্রয়েড সংস্করণ "23" বা "23+" ব্যবহার করেন, তবে অ্যাপ্লিকেশন আপনাকে ত্রুটিগুলি দেখাবে যখন আপনি ব্যবহারকারীর অনুমতি প্রয়োজন এমন কোনও কিছু অ্যাক্সেস করার চেষ্টা করছেন। আপনি অ্যান্ড্রয়েড ম্যানিফেস্টে এই অনুমতিগুলি ঘোষণা করলেও রান-টাইমে আপনাকে অনুমতি চাইতে হবে।

এটি দেখুন: https://developer.android.com/training/permission/requesting.html

তবে আপনি যদি নিজের পুরো অ্যাপ্লিকেশনটি তৈরি করে থাকেন এবং প্রতিটি জায়গায় পরিবর্তন করতে না চান তবে একটু ঠকাই যথেষ্ট।

"বিল্ড.gradle" ফাইলটিতে যান এবং টার্গেট এসডিকে সংস্করণটি 22, 21 এর মতো 23 এরও কম পরিবর্তন করুন।


1

কমন্সওয়্যার এর উত্তর সহ,

এসএমএস বার্তার সীমা নির্ধারণের জন্য একটি সুরক্ষা সেটিং রয়েছে (আমি সিএম 13 এ দেখেছি)। আপনি যদি এটিকে "কিছুই নয়" তে সেট করেন, রানটাইমে SMS_SEND অনুমতি পাওয়ার পরেও ওএস প্রতিটি এসএমএসের জন্য একটি ডায়ালগ পপআপ করবে। সেরা জিনিসটি এটি সর্বাধিকতে সেট করা।

সর্বাধিক পরিমাণ পর্যাপ্ত না হলে মূলের ডিভাইসে সর্বোচ্চ হার বাড়ানোর উপায় রয়েছে।


0

আপনি আপনার বার্তাগুলি অ্যাক্সেস করতে এই কোডটি ব্যবহার করতে পারেন

নীচের কোডটি ব্যবহার করে একটি ডায়ালগ খুলুন:

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

ক্রিয়াকলাপ নীচের হিসাবে পান:

@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 was granted, yay! Do the
                // contacts-related task you need to do.          
            } 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;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

বা ফাইল build.gradleএবং চঞ্চে সংখ্যাটি targetSdkVersionকম সম্পাদনা করুন এবং 23
উপরের কোডের আর প্রয়োজন নেই

দ্রষ্টব্য
অবশ্যই এটি ঘটনা নয় এবং এটি কেবল একটি শিক্ষামূলক দিক


0

সুতরাং আমাকে বার্তাগুলি প্রেরণ ও গ্রহণ করতে একটি অ্যাপ তৈরি করতে হয়েছিল তবে যখনই অনুমতি দেওয়া হয়েছিল তবুও আমি প্রেরণে ক্লিক করলে প্রেরণ ক্রিয়াটি ক্র্যাশ হয়ে যায়। আমি রানটাইম অনুমতিগুলির জন্য অনুরোধ করেছি এবং তাদের অনুমতি দিয়েছিলাম, তবুও আমি একটি ক্র্যাশের মুখোমুখি হয়েছি যে প্রক্রিয়াটির কাছে এসএমএস পাঠানোর অনুরোধকৃত অনুমতি নেই have আমি এর থেকে অনুমোদিত অনুমতিগুলি পরীক্ষা করেছিলাম:

adb shell dumpsys package <package-name>

অনুমতিগুলির জন্য আমার অনুরোধের আদেশ ছিল

  1. RECEIVE_SMS
  2. বার্তা পাঠান

আমি অনুরোধের ক্রমটি ফিরিয়ে দিয়েছি এবং এটি ঠিকঠাক কাজ করে। এটি একটি সম্পূর্ণ নতুন অ্যাপ্লিকেশন (আনইনস্টল-> ইনস্টল -> পরীক্ষা) দিয়ে পরীক্ষা করা হয়েছিল। উত্তরটি অদ্ভুত মনে হলেও কেবল একটি শট দিন।

(যদি এটি একটি নির্দিষ্ট ক্রমে দেখানো উপায়ে কাজ করে তবে অ্যান্ড্রয়েডে একটি বাগ থাকতে পারে !!)


0

আমি আশা করি বাহ্যিক স্টোরেজে লেখার সমাধানটিও কার্যকর হবে

public  boolean checkPermission() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                Timber.tag(LOG_TAG).e("Permission error. You have permission");
                return true;
            } else {
                Timber.tag(LOG_TAG).e("Permission error. You have asked for permission");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                return false;
            }
        }
        else { 
            // for a stuff below api level 23
            Timber.tag(LOG_TAG).e("Permission error. You already have the permission");
            return true;
        }
    }

0

সমস্ত অনুমতিগুলির তালিকা এখানে ব্যাখ্যা সহ পাওয়া যাবে

Manifest.permission

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