วิธีการเปิดหน้าจอการอนุญาตโดยทางโปรแกรมสำหรับแอปเฉพาะบน Android Marshmallow


330

ฉันมีคำถามเกี่ยวกับ Android Marshmallow ใหม่:

เป็นไปได้ไหมที่จะแสดงหน้าจอการอนุญาตสำหรับแอพที่ต้องการผ่านทาง Intent หรือสิ่งที่คล้ายกัน

หน้าจออนุญาตของ Android M

เป็นไปได้หรือไม่ที่จะแสดงการตั้งค่าแอพด้วยรหัสต่อไปนี้ - มีระบบอะนาล็อกสำหรับเปิดหน้าจอการอนุญาตโดยตรงหรือไม่?

startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", getPackageName(), null)));

ฉันได้ทำการวิจัยเกี่ยวกับเรื่องนี้แล้ว แต่ฉันไม่สามารถหาวิธีแก้ปัญหาที่เหมาะสมได้ - ฉันขอขอบคุณทุกความช่วยเหลือ!


ลองสิ่งนี้มันอาจจะเป็นstackoverflow.com/a/41221852/5488468
Bipin Bharti

คำตอบ:


443

ตามวิดีโอการอนุญาต Marshmallow อย่างเป็นทางการ (ที่เครื่องหมาย 4m 43 ) คุณต้องเปิดหน้าการตั้งค่าแอปพลิเคชันแทน (จากที่นั่นจะเป็นการคลิกเพียงครั้งเดียวไปยังหน้าการอนุญาต)

เพื่อเปิดหน้าการตั้งค่าคุณจะทำ

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

12
มันกำลังเปลี่ยนเส้นทางไปยังรายละเอียดทั่วไปของหน้าจอแอปพลิเคชัน จะไปที่หน้าจอการอนุญาตเฉพาะของแอพได้อย่างไร ฉันไม่ต้องการให้เหลือเพียงคลิกเดียว
Milind Mevada

5
@MilindMevada - คุณไม่สามารถทำได้ในขณะนี้
Martin Konecny

คุณสามารถส่งข้อมูลจากกิจกรรมการตั้งค่าไปยังกิจกรรมของคุณโดยใช้ intents ได้ใน "เรียลไทม์" ปัญหาที่ฉันเผชิญคือการจัดการข้อมูลนี้ในกิจกรรมของคุณเมื่อได้รับจากการตั้งค่า
ThunderWiring

การทำงานนี้เมื่อทำการดีบักแอป แต่ล้มเหลวโดยไม่มีเหตุผลจริงหลังจากลงชื่อ APK ไม่มีอะไรที่ชัดเจนใน logcat เช่นกัน
JCutting8

181

สิ่งนี้เป็นไปไม่ได้ ฉันก็พยายามทำเช่นกัน ฉันสามารถหาชื่อแพ็คเกจและกิจกรรมที่จะเริ่มขึ้น แต่ในที่สุดคุณจะได้รับข้อยกเว้นด้านความปลอดภัยเนื่องจากการอนุญาตที่ขาดหายไปคุณไม่สามารถประกาศได้

UPDATE:

เกี่ยวกับคำตอบอื่น ๆ ฉันขอแนะนำให้เปิดหน้าจอการตั้งค่าแอพ ฉันทำสิ่งนี้ด้วยรหัสต่อไปนี้:

    public static void startInstalledAppDetailsActivity(final Activity context) {
    if (context == null) {
        return;
    }
    final Intent i = new Intent();
    i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    i.addCategory(Intent.CATEGORY_DEFAULT);
    i.setData(Uri.parse("package:" + context.getPackageName()));
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    context.startActivity(i);
}

เนื่องจากฉันไม่ต้องการมีสิ่งนี้ในสแต็คประวัติของฉันฉันลบมันออกโดยใช้การตั้งค่าสถานะความตั้งใจ


ฉันมีประสบการณ์แบบเดียวกันและคิดว่าอาจจะมีวิธีแก้ปัญหา / วิธีแก้ปัญหาอื่นสำหรับเรื่องนี้ ... : - /
Frederik Schweiger

ไม่น่าเสียดายที่มันไม่สามารถทำได้โดยการออกแบบ สำหรับข้อมูลเพิ่มเติมตรวจสอบการสนทนานี้ใน Google+: goo.gl/Wqjjff
Frederik Schweiger

1
@Mulgard Whatsapp ต้องใช้ targetSdk = "23" อนุญาตให้แอปแจ้งเตือนผู้ใช้ให้เปิดใช้งานการอนุญาต หาก SDK เป้าหมายของคุณ <23 การแสดงผู้ใช้หน้าจอการอนุญาตแอปมีประโยชน์ แต่ดูเหมือนว่าเราจะสามารถแสดงหน้าจอการตั้งค่าแอปทั่วไปเท่านั้น
vman

4
Intent.FLAG_ACTIVITY_NO_HISTORY บางครั้งอาจทำให้เกิดปัญหากับแท็บเล็ตเมื่อมีป๊อปอัปปรากฏขึ้นในหน้าจอการตั้งค่ามันจะปิดหน้าจอการตั้งค่า การลบการตั้งค่าสถานะนั้นจะช่วยแก้ปัญหานี้ได้
Wirling

2
คุณสามารถแสดง Toast พร้อมกันสั่งให้ผู้ใช้เข้าสู่ "การอนุญาต" (ขอแนะนำให้แปลข้อความนี้แม้ว่าแอพที่เหลือของคุณจะไม่สามารถใช้งานได้ในภาษาของผู้ใช้)
vgergo

81
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

คำอธิบาย เปิดหน้าการตั้งค่ารายละเอียดสำหรับแอพ จากที่นี่ผู้ใช้จะต้องกำหนดสิทธิ์ที่ต้องการด้วยตนเอง

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

Intent.FLAG_ACTIVITY_NEW_TASK
   ไม่จำเป็น หากตั้งค่าไว้จะเปิดหน้าจอการตั้งค่า (กิจกรรม) เป็นกิจกรรมใหม่ มิฉะนั้นจะเปิดในกิจกรรมที่กำลังทำอยู่

Uri.fromParts("package", getPackageName(), null)
   จัดเตรียมหรือสร้าง URI ในขณะที่ getPackageName () - ส่งคืนชื่อของแพ็คเกจแอปพลิเคชันของคุณ

intent.setData(uri)
   อย่าลืมที่จะตั้งค่านี้ android.content.ActivityNotFoundExceptionมิฉะนั้นคุณจะได้รับ เพราะคุณได้ตั้งความตั้งใจของคุณเป็น Settings.ACTION_APPLICATION_DETAILS_SETTINGS และ Android คาดว่าชื่อเพื่อค้นหา


นี่คือคำตอบที่ได้รับการโหวตสูงสุด ทำซ้ำสิ่งนี้และไม่ขยายคำตอบเดิม!
โทมัสเคลเลอร์

1
ขอบคุณสำหรับคำอธิบายในเชิงลึก
David Refoua

34

คุณสามารถเปิดการตั้งค่าทั่วไปของแอพได้โดยใช้หนึ่งบรรทัดแทน

 startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));

คุณอาจต้องการใช้ getActivity (). getPackageName () เพื่อรับชื่อแพ็คเกจขึ้นอยู่กับการกำหนดค่าบิลด์ของคุณ
คอรีรอย

15

ไม่สามารถเปิดหน้าจอการอนุญาตโดยทางโปรแกรม แต่เราสามารถเปิดหน้าจอการตั้งค่าแอพแทน

รหัส

Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
startActivity(i);

ตัวอย่างผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่


1
เขากำลังขอหน้าสิทธิ์
Maveňツ

10

หากคุณต้องการเขียนโค้ดให้น้อยลงKotlinคุณสามารถทำได้:

fun Context.openAppSystemSettings() {
    startActivity(Intent().apply {
        action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
        data = Uri.fromParts("package", packageName, null)
    })
}

ขึ้นอยู่กับ คำตอบของMartin Konecny


ใช้ประโยชน์จากส่วนขยายของ Kotin
David Jarvis


5

อาจเป็นสิ่งนี้จะช่วยคุณ

private void openSettings() {
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    Uri uri = Uri.fromParts("package", getPackageName(), null);
    intent.setData(uri);
    startActivityForResult(intent, 101);
}

3

หากเรากำลังพูดถึงFLYME OS (Meizu) เท่านั้นมีแอพความปลอดภัยของตัวเองที่ได้รับอนุญาต

ในการเปิดใช้ให้ใช้ความตั้งใจดังต่อไปนี้:

public static void openFlymeSecurityApp(Activity context) {
    Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
    try {
        context.startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

ของสาเหตุBuildConfigเป็น app ของคุณBuildConfig


3

Xamarin Forms Android:

//---------------------------------------------------------
public void OpenSettings()
//---------------------------------------------------------
{
    var intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings,
        Android.Net.Uri.Parse("package:" + Forms.Context.PackageName));
    Forms.Context.StartActivity(intent);
}

0

เป็นไปไม่ได้ที่จะได้รับการอนุญาตในทางปฏิบัติ แต่ไม่แนะนำให้คุณใส่บรรทัดของรหัสนั้นในการลอง {} catch {} ซึ่งทำให้แอปของคุณหยุดอย่างน่าเสียดาย ... และในกล่องข้อความที่จะนำทาง ผู้ใช้งานกวดวิชาขนาดเล็กเพื่อเปิดใช้งานการดึงสิทธิ์การใช้งานแอพอื่น ๆ ... จากนั้นคลิกที่ปุ่มใช่ใส่รหัสนี้ ...

 Intent callSettingIntent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            startActivity(callSettingIntent);

ความตั้งใจนี้คือการเปิดรายการการดึงผ่านแอพอื่น ๆเพื่อจัดการการอนุญาตโดยตรงและจากที่นี่มันเป็นการคลิกครั้งเดียวเพื่อการดึงแอพพลิเคชั่นอื่น ๆ การอนุญาต ... ฉันรู้ว่านี่ไม่ใช่คำตอบที่คุณกำลังมองหา ... ฉันกำลังทำสิ่งนี้ในแอปของฉัน ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.