web-dev-qa-db-ja.com

AndroidアクティビティなしでのonRequestPermissionsResult

ユーザーlocationを見つける必要があるアプリケーションがあり、さまざまなクラスで場所が取得されるため、locationを使用してユーザーの場所を取得する別のクラス(アクティビティクラスではありません) servicesAndroid Mで正常に動作しますが、Android Mで実行時の権限が必要ですしかし、Locationクラスはどのアクティビティからも拡張されないため、LocationクラスでonRequestPermissionsResultメソッドを使用することはできません。

だから私はこれを達成するために何をすべきですか?任意のヘルプ/手がかりは高く評価されています

20

public void onRequestPermissionsResult(int requestCode、String permissions []、int [] grantResults)の抽象メソッドであるためActivityCompat.OnRequestPermissionsResultCallbackインターフェイス。 ドキュメント を参照してください

このインターフェイスを必要なクラスに実装するだけで完了です。例えば

class location implements  ActivityCompat.OnRequestPermissionsResultCallback{ }

今すぐオーバーライドonRequestPermissionsResult()

 @Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
     // case Statements
    }
}
16
AkshayK

非UIクラスからcheckSelfPermission()を呼び出すことを歓迎します。これは、いくつかのContextを必要とするだけです。

ただし、何らかのアクティビティまたはフラグメントでrequestPermissions()を呼び出す必要があります。その上でonRequestPermissionsResult()をオーバーライドします同じアクティビティまたはフラグメント。これは、startActivityForResult()を呼び出してonActivityResult()を実装することと同じです。

アイデアは、場所を処理する非UIクラスに関係することを行う前に、許可を要求することです。

7
CommonsWare

1-透過的なアクティビティを作成する

_<activity Android:name=".activity.activity.CheckStoragePermissionsActivity" Android:theme="@style/Theme.Transparent">

<style name="Theme.Transparent" parent="Theme.AppCompat">
        <item name="Android:windowIsTranslucent">true</item>
        <item name="Android:windowBackground">@Android:color/transparent</item>
        <item name="Android:windowContentOverlay">@null</item>
        <item name="Android:windowNoTitle">true</item>
        <item name="Android:windowIsFloating">true</item>
        <item name="Android:backgroundDimEnabled">false</item>
    </style>
_

2-アクティビティをカスタマイズする

_public class CheckStoragePermissionsActivity extends AppCompatActivity {

    private String[] permissions;
    private int pCode = 12321;
    public static PermissionListener permissionListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        checkPermissions();
    }

    private void checkPermissions() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};

            boolean flag = false;
            for (String s : permissions)
                if (checkSelfPermission(s) != PackageManager.PERMISSION_GRANTED)
                    flag = true;

            if (flag) {
                requestPermissions(permissions, pCode);
            } else {
                permissionListener.permissionResult(true);
                finish();
            }
        }else
            finish();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == pCode) {
            boolean flag = true;
            if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.M)
                for (int i = 0, len = permissions.length; i < len; i++)
                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED)
                        flag = false;
            if (flag) {
                if (permissionListener != null)
                    permissionListener.permissionResult(true);
            } else if (permissionListener != null)
                permissionListener.permissionResult(false);
            finish();
        }
    }
}
_

3- permissionListenerは静的インターフェイスであり、context.startActivity(...)の直前に設定するか、プランを使用して許可結果を見つけることができます。

_public interface PermissionListener extends Serializable {
    void permissionResult(boolean hasPermission);
}
_

4-最後にcontext.startActivity(new Intent(context, CheckStoragePermissionsActivity.class));を呼び出します

CheckStoragePermissionsActivityは必要なすべてを実行し、ユーザーの許可または拒否アクションの後に終了します。

4
Misagh

上書きすることはできません。このメソッドは、アクティビティとフラグメントでのみ使用できます。ただし、Locationクラス内に静的メソッドを作成し、アクティビティ/フラグメントのオーバーライドされたonRequestPermissionResultメソッドから呼び出すことができます。

Locationのカスタム実装を許可と組み合わせて作成しました。また、許可にLetというライブラリを使用することもできます。

4
Embydextrous

おそらく、アクティビティを拡張するクラスを作成し(AppCompactActivityの方が良い)、必要なすべてのロケーションコードを実装し、このクラスを使用して必要なすべてのアクティビティを拡張できます。

0
user3132789