Làm cách nào để lập trình mở Màn hình cấp phép cho một ứng dụng cụ thể trên Android Marshmallow?


330

Tôi có một câu hỏi liên quan đến phiên bản Android Marshmallow mới:

Có thể hiển thị Màn hình Cấp phép cho một ứng dụng cụ thể thông qua Ý định hoặc một cái gì đó tương tự không?

Màn hình cấp phép Android M

Bạn có thể hiển thị các cài đặt ứng dụng với mã sau đây - có giải pháp tương tự nào để mở trực tiếp Màn hình Cấp phép không?

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

Tôi đã thực hiện một số nghiên cứu về vấn đề này nhưng tôi không thể tìm ra giải pháp thích hợp - tôi sẽ đánh giá cao mọi sự giúp đỡ!


Hãy thử nó có thể là công việc stackoverflow.com/a/41221852/5488468
Bipin Bharti

Câu trả lời:


443

Theo video quyền hạn Marshmallow chính thức (ở mốc 4m 43s ), bạn phải mở trang Cài đặt ứng dụng thay thế (từ đó chỉ cần một cú nhấp chuột vào trang Quyền).

Để mở trang cài đặt, bạn sẽ làm

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

12
Nó đang chuyển hướng đến chi tiết chung của màn hình Ứng dụng. Làm thế nào có thể đi đến màn hình Quyền ứng dụng cụ thể. Tôi cũng không muốn một lần nhấp nữa,
Milind Mevada

5
@MilindMevada - bạn không thể làm điều đó vào lúc này.
Martin Konecny

bạn có thể gửi dữ liệu từ hoạt động cài đặt đến hoạt động của mình bằng cách sử dụng ý định, trong "thời gian thực" không? vấn đề tôi gặp phải là xử lý dữ liệu này trong hoạt động của bạn sau khi nó được gửi từ cài đặt.
ThunderWires

Điều này hoạt động khi gỡ lỗi ứng dụng, nhưng gặp sự cố không có lý do thực sự sau khi ký APK. Không có gì rõ ràng trong logcat.
JCocking8

181

Điều này là không thể. Tôi cũng cố gắng làm như vậy. Tôi có thể tìm ra tên gói và hoạt động sẽ được bắt đầu. Nhưng cuối cùng, bạn sẽ nhận được một ngoại lệ bảo mật vì thiếu quyền mà bạn không thể khai báo.

CẬP NHẬT:

Về câu trả lời khác, tôi cũng khuyên bạn nên mở màn hình Cài đặt ứng dụng. Tôi làm điều này với mã sau đây:

    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);
}

Vì tôi không muốn có cái này trong ngăn xếp lịch sử của mình, tôi xóa nó bằng cờ ý định.


Tôi đã trải nghiệm tương tự và nghĩ rằng có thể có một cách giải quyết / giải pháp khác cho việc này ...: - /
Frederik Schweiger

Không, không may là nó không thể thiết kế. Để biết thêm thông tin, hãy xem cuộc thảo luận này trên Google+: goo.gl/Wqjjff
Frederik Schweiger

1
@Mulgard Whatsapp phải được sử dụng targetSdk = "23". Điều này cho phép ứng dụng nhắc người dùng kích hoạt quyền. Nếu SDK mục tiêu của bạn <23, việc có thể hiển thị cho người dùng màn hình quyền ứng dụng là hữu ích, tuy nhiên có vẻ như chúng tôi chỉ có thể hiển thị màn hình cài đặt ứng dụng chung.
vman

4
Intent.FLAG_ACTIVITY_NO_HISTORY đôi khi có thể gây ra sự cố trên máy tính bảng khi cửa sổ bật lên được hiển thị trong màn hình cài đặt, nó sẽ đóng màn hình cài đặt. Đơn giản chỉ cần loại bỏ cờ đó sẽ giải quyết vấn đề này.
Wirling

2
Bạn có thể hiển thị Toast đồng thời hướng dẫn người dùng đi vào "Quyền" (ý tưởng tốt để bản địa hóa thông báo này ngay cả khi phần còn lại của ứng dụng của bạn không có sẵn bằng ngôn ngữ của người dùng)
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);

Mô tả Mở trang cài đặt Chi tiết cho Ứng dụng. Từ đây người dùng phải tự gán quyền mong muốn.

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

Intent.FLAG_ACTIVITY_NEW_TASK
   Tùy chọn . Nếu được đặt thì sẽ mở Màn hình cài đặt (Hoạt động) dưới dạng hoạt động mới. Nếu không, nó sẽ được mở trong hoạt động hiện đang chạy.

Uri.fromParts("package", getPackageName(), null)
   Chuẩn bị hoặc tạo URI, trong khi đó, getPackageName () - trả về tên của gói ứng dụng của bạn.

intent.setData(uri)
   Đừng quên thiết lập điều này . Nếu không, bạn sẽ nhận được android.content.ActivityNotFoundException . Bởi vì bạn đã đặt ra ý định của mình Settings.ACTION_APPLICATION_DETAILS_SETTINGS và android mong muốn một số tên để tìm kiếm.


Đây đúng là những gì câu trả lời được bình chọn hàng đầu. Tại sao trùng lặp điều này và không mở rộng câu trả lời ban đầu?!
Thomas Keller

1
Cảm ơn bạn đã giải thích sâu sắc.
David Refoua

34

Thay vào đó, bạn có thể mở cài đặt chung của ứng dụng cụ thể bằng một dòng

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

Bạn có thể muốn sử dụng getActivity (). GetPackageName () để lấy tên gói tùy thuộc vào cách cấu hình của bạn được cấu hình.
Cory Roy

15

Không thể lập trình mở màn hình cho phép. Thay vào đó, chúng ta có thể mở màn hình cài đặt ứng dụng.

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

Đầu ra mẫu

nhập mô tả hình ảnh ở đây


1
Anh ta đang xin trang Giấy phép
Maveň 28/12/18

10

Nếu bạn muốn viết ít mã hơn, Kotlinbạn có thể làm điều này:

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

Dựa trên câu trả lời của Martin Konecny


sử dụng tốt các tiện ích mở rộng của Kotin
David Jarvis

6

Phong cách Kotlin.

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

5

Có lẽ điều này sẽ giúp bạn

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

Nếu chúng ta đang nói về FLYME OS (Meizu) CHỈ có nó ứng dụng an ninh riêng với các điều khoản.

Để mở nó sử dụng ý định sau:

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();
    }
}

Of-nguyên nhân BuildConfig là ứng dụng của bạn BuildConfig .


3

Mẫu Xamarin 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

Thực tế không thể có được sự cho phép ... nhưng tôi khuyên bạn nên đặt dòng mã đó vào thử {} Catch {} khiến ứng dụng của bạn không may dừng lại ... và trong phần thân bắt, hãy tạo một hộp thoại sẽ điều hướng hướng dẫn sử dụng nhỏ để kích hoạt sự cho phép của các ứng dụng khác ... sau đó vào nút có, nhấp vào đặt mã này ...

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

Mục đích này là trực tiếp mở danh sách rút thăm các ứng dụng khác để quản lý quyền và sau đó từ đây chỉ cần một cú nhấp chuột để rút thăm các ứng dụng khác Quyền ... tôi biết đây không phải là câu trả lời bạn đang tìm kiếm ... nhưng Tôi đang làm điều này trong các ứng dụng của tôi ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.