फायरमोनकी एंड्रॉइड read_phone_state रनटाइम अनुमति आईएमईआई - एंड्रॉइड, डेल्फी, अनुमतियां, फायरमोनकी, डेल्फी -10.2-टोक्यो प्राप्त करने के लिए पूछती है

मैं आईएमईआई नंबर प्राप्त करने के लिए रनटाइम पर read_phone_state अनुमति कैसे प्राप्त कर सकता हूं?

  if not HasPermission("android.permission.READ_PHONE_STATE") then
begin

//ASK AND GET PERMISSION ?

end;


function TForm1.HasPermission(const Permission: string): Boolean;
begin
//Permissions listed at http://d.android.com/reference/android/Manifest.permission.html
{$IF RTLVersion >= 30}
Result := TAndroidHelper.Context.checkCallingOrSelfPermission(
{$ELSE}
Result := SharedActivityContext.checkCallingOrSelfPermission(
{$ENDIF}
StringToJString(Permission)) =
TJPackageManager.JavaClass.PERMISSION_GRANTED;


end;

उत्तर:

जवाब के लिए 3 № 1

संपादित करें:खेद है कि मैंने फायरमॉन्की पर थोड़ा और होमवर्क नहीं किया था। यही वह है जो मुझे अपने सिर को उन विषयों में चिपकाने के लिए मिलता है जहां यह संबंधित नहीं है। मैंने इस सामग्री को मेरे उत्तर को बक्षीस के अधिक योग्य बनाने की कोशिश करने के लिए जोड़ा है।

यदि आप प्रतिबंधित कर सकते हैं targetSdk ऐप पर 22 (5.1 लॉलीपॉप) के लिए प्रकट होता है तो उपयोगकर्ता को इंस्टॉल करने की अनुमति देना होगा HasPermission कभी झूठी वापसी नहीं करनी चाहिए। (सुनिश्चित नहीं है कि यह FireMonkey के साथ कैसे काम करता है)।

यदि आप मार्शमलो + में गतिशील अनुमति क्षमताओं का उपयोग करना चाहते हैं, तो यहां कुछ जानकारी दी गई है जो मैंने प्राप्त की है यह पन्ना:

आपको पहुंच की आवश्यकता है Activity कॉलबैक विधि onRequestPermissionsResult। यहां "सभी हुप्स आपको कूदना होगा:

  • ओपन-सोर्स टूल का उपयोग करें Dex2Jar एंड्रॉइड को कन्वर्ट करें classes.dex डेल्फी से वापस जावा तक फ़ाइल ताकि आप के खिलाफ संकलित कर सकें FMXNativeActivity कक्षा।
  • कोड एक उप-वर्ग FMXNativeActivity जावा में जो परिभाषित करता है native विधि (चलो इसे कॉल करें onRequestPermissionsResultNative और यह भी ओवरराइड करता है onRequestPermissionsResult देशी विधि के माध्यम से कॉल करने के लिए विधि।
  • रन javac अपने सबक्लास के साथ .class फ़ाइल प्राप्त करने के लिए
  • रन jar .class फ़ाइल को .jar फ़ाइल में डालने के लिए
  • रन dx.bat अपने .jar फ़ाइल को एंड्रॉइड .dex फ़ाइल में बदलने के लिए
  • रन DexMerger डेल्फी की sds.dex फ़ाइल में अपनी .dex फ़ाइल को मर्ज करने के लिए
  • अब जो कुछ करने के लिए छोड़ दिया गया है वह आपके परिभाषित करने के लिए कुछ मुश्किल डेल्फी कोड लिखना है onRequestPermissionsResultNative विधि और जेएनआई पर्यावरण के साथ इसे पंजीकृत करें। ओह, और अपने मूल विधि में सही धागे पर स्विच करना न भूलें।

जिस संदर्भ में मैंने संदर्भित किया है, यह दिखाता है कि इसे कैसे किया जाए onActivityResult। आपको अन्य तरीकों के लिए इन चरणों को अनुकूलित करना होगा।

और मैंने यह भी नहीं बताया कि ओएस को आपके ऐप को रोकने के लिए उपयोगकर्ता को अनुमति के लिए पूछने और इसे फिर से शुरू करने के तरीके को कैसे संभालना है।

यह सभी को सबक दें: क्रॉस-प्लेटफॉर्म टूल में अपना विश्वास न डालें; आप निराश होंगे।


मैं जावा में डेल्फी नहीं काम करता हूं, इसलिए आपको यहां थोड़ा सा विस्तार करना होगा।

आप की तरह, मुझे आईएमईआई नंबर प्राप्त करना है, औरसिस्टम संवाद उपयोगकर्ता को कुछ ऐसा पूछता है: "ऐप को फ़ोन कॉल करने और प्रबंधित करने की अनुमति दें?" मुझे उपयोगकर्ता को यह बताने की ज़रूरत है कि वह ऐप सिर्फ डिवाइस आईडी प्राप्त कर रहा है और फोन कॉल करने या प्रबंधित करने वाला नहीं है।

  • जांचें कि क्या आपके पास अनुमति है या नहीं
  • अगर आपके पास अनुमति नहीं है, तो जांच करें कि आपको स्पष्टीकरण दिखाना चाहिए या नहीं
  • यदि आपको स्पष्टीकरण दिखाने की ज़रूरत नहीं है, तो अनुमति अनुरोध ऑपरेशन शुरू करें

मुझे इसका जिक्र करना चाहिए shouldShowRequestPermissionRationale तथा requestPermissions पर तरीके हैं Activity कक्षा।

    private static final int READ_PHONE_STATE_PERMISSIONS_REQUEST = 2;

private boolean mHasReadRationale;

void doPermissionsStuff() {
// version checking code omitted, this block runs for marshmallow and later
if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
// do the operation that needs the permission here
} else {
// the flag indicates if the rationale dialog has already been displayed
if (! mHasReadRationale && shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) {
// pop a dialog that explains what"s going on to the user
} else {
requestPermissions(new String[] {Manifest.permission.READ_PHONE_STATE}, READ_PHONE_STATE_PERMISSIONS_REQUEST);
}
}
}

इस संवाद के सकारात्मक बटन में (यानी उपयोगकर्ता जारी रखना चाहता है) सेट करें mHasReadRationale सच और कॉल करने के लिए ध्वज doPermissionsStuff फिर। (रद्द करने के लिए, मैं उपयोगकर्ता को पिछली स्क्रीन पर वापस भेजता हूं।)

के परिणाम प्राप्त करने के लिए requestPermissions ऑपरेशन आपको ओवरराइड करने की आवश्यकता है Activity"रों onRequestPermissionsResult तरीका:

private boolean mPermissionDenied;

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

switch (requestCode) {
case READ_PHONE_STATE_PERMISSIONS_REQUEST:
// I"m only checking for one permission, so I make assumptions here
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// you can do the operation that needs the permission now
} else {
mPermissionDenied = true;  // set a flag for checking later
}
}
}

जाहिर है जब सिस्टम उपयोगकर्ता के लिए पूछता हैअनुमति है, यह आपके ऐप को रोकता है, इसलिए आप उस यूजर को यह बताने के लिए यूआई नहीं दिखा सकते कि आपके पास अनुमति नहीं है। तो मैंने एक ध्वज सेट किया और जब ऐप फिर से शुरू होता है, फिर मैं उपयोगकर्ता को बताता हूं कि ऐप को ऑपरेशन करने की अनुमति नहीं है।

@Override
protected void onResumeFragments() {
super.onResumeFragments();
if (mPermissionDenied) {
// show dialog to the user that the app can"t do the operation because it doesn"t have permission
mPermissionDenied = false;
}
}

तो यहां एक उदाहरण प्रवाह है:

  • उपयोगकर्ता चाहता है कि एक नि: शुल्क परीक्षण और ऐप को आईएमईआई प्राप्त करने की आवश्यकता हो ताकि वे मुफ्त परीक्षण को बार-बार नहीं ले सकें, जीज़। ऐप कॉल doPermissionsStuff()
  • ऐप कॉल checkSelfPermission() और यह निर्धारित करता है कि अनुमति अभी तक दी गई है
  • ऐप कॉल shouldShowRequestPermissionRationale()। मेरे अनुभव में, shouldShowRequestPermissionRationale() उपयोगकर्ता ने अनुमति को अस्वीकार कर दिए जाने के बाद केवल सत्य ही लौटाया। तो आप अभी तक उपयोगकर्ता को तर्क यूआई प्रदर्शित नहीं करते हैं।
  • ऐप कॉल requestPermissions()
  • सिस्टम उपयोगकर्ता से पूछेगा "फोन कॉल करने और प्रबंधित करने के लिए एप्लिकेशन को अनुमति दें?"
  • उपयोगकर्ता निर्णय लेता है कि यह WAAAAAAY बहुत डरावना है और कोई बटन दबाता है।
  • onRequestPermissionsResult() इनकार परिणाम और के साथ बुलाया जाता है mPermissionDenied सेट हो जाता है
  • onResumeFragments() कॉल किया जाता है और उपयोगकर्ता को एक संवाद प्रदर्शित किया जाता है कि उन्हें नि: शुल्क परीक्षण नहीं मिल सकता क्योंकि ऐप की अनुमति नहीं है।
  • उपयोगकर्ता फिर कोशिश करने का फैसला करता है। doPermissionsStuff() कहा जाता है।
  • ऐप कॉल checkSelfPermission() और (फिर से) निर्धारित करता है कि अनुमति अभी तक दी गई है
  • ऐप कॉल shouldShowRequestPermissionRationale()। इस बार यह सच हो जाता है।
  • ऐप एक शांत और सुखद संदेश प्रदर्शित करता हैउपयोगकर्ता जो नहीं, हम आपके फोन पर नहीं जा रहे हैं, हम सिर्फ फ्रीकिन चाहते हैं "आईएमईआई नंबर, यह सब कुछ है, और यदि आप ऐप को आईएमईआई तक पहुंचने की अनुमति नहीं देते हैं, तो आपको कोई नहीं मिलता है नि: शुल्क परीक्षण। मुझे रेखा खींचनी है कहीं
  • उपयोगकर्ता प्रेस जारी है, तो mHasReadRationale ध्वज सत्य पर सेट है और doPermissionsStuff() विधि फिर से बुलाया जाता है।
  • ऐप कॉल checkSelfPermission() और अंदाज लगाइये क्या? अनुमति अभी तक नहीं दी गई है
  • चूंकि ध्वज सेट किया गया है, इसलिए उपयोगकर्ता को तर्कसंगत यूआई नहीं मिलता है।
  • ऐप कॉल requestPermissions()
  • सिस्टम उपयोगकर्ता से पूछेगा "फोन कॉल करने और प्रबंधित करने के लिए एप्लिकेशन को अनुमति दें?"
  • प्रयोक्ता भाग्य से खुद को इस्तीफा देता है और हां दबाता है।
  • onRequestPermissionsResult() दिए गए परिणाम के साथ बुलाया जाता है और नि: शुल्क परीक्षण पंजीकरण आगे बढ़ता है।

आपको Google के नमूना कोड को भी देखना चाहिए https://developer.android.com/samples/RuntimePermissions/index.html


संबंधित सवाल
सबसे लोकप्रिय