国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 基于Fragment的權(quán)限封裝

這篇具有很好參考價(jià)值的文章主要介紹了Android 基于Fragment的權(quán)限封裝。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Android 基于Fragment的權(quán)限封裝

原理

業(yè)內(nèi)普遍比較認(rèn)可使用另外一種小技巧來進(jìn)行實(shí)現(xiàn)。是什么小技巧呢?回想一下,之前所有申請(qǐng)運(yùn)行時(shí)權(quán)限的操作都是在 Activity 中進(jìn)行的,事實(shí)上,Android 在 Fragment 中也提供了一份相同的 API,使得我們?cè)?Fragment 中也能申請(qǐng)運(yùn)行時(shí)權(quán)限。

但不同的是,F(xiàn)ragment 并不像 Activity 那樣必須有界面,我們完全可以向 Activity 中添加一個(gè)隱藏的 Fragment,然后在這個(gè)隱藏的 Fragment 中對(duì)運(yùn)行時(shí)權(quán)限的 API 進(jìn)行封裝。這是一種非常輕量級(jí)的做法,不用擔(dān)心隱藏 Fragment 會(huì)對(duì) Activity 的性能造成什么影響。文章來源地址http://www.zghlxwxcb.cn/news/detail-817815.html

代碼

PermissionUtils.java

/**
 * 權(quán)限工具類
 */
public class PermissionUtils {
    public static final int REQUEST_SETTING_CODE = 0X123456;

    /**
     * 權(quán)限是否授予
     */
    public static boolean isGranted(@NonNull Context context, @NonNull String permission) {
        return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
    }

    /**
     * 權(quán)限是否全部授予
     */
    public static boolean isGrantedPermissions(@NonNull Context context, @NonNull ArrayList<String> permissionList) {
        for (String permission : permissionList) {
            if (!isGranted(context, permission)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 權(quán)限是否拒絕且不再詢問
     */
    public static boolean isDeniedNever(@NonNull Activity activity, @NonNull String permission) {
        return !ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
    }

    /**
     * 權(quán)限是否包含拒絕且不再詢問
     */
    public static boolean isDeniedNeverPermissions(@NonNull Activity activity, @NonNull ArrayList<String> permissions) {
        for (String permission : permissions) {
            if (isDeniedNever(activity, permission)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 獲取未授權(quán)權(quán)限
     */
    public static ArrayList<String> getDeniedPermissions(@NonNull Context context, @NonNull ArrayList<String> permissionList) {
        ArrayList<String> deniedPermissionList = new ArrayList<>();
        for (String permission : permissionList) {
            if (!isGranted(context, permission)) {
                deniedPermissionList.add(permission);
            }
        }
        return deniedPermissionList;
    }

    /**
     * 獲取包名Uri
     */
    static Uri getPackageNameUri(@NonNull Context context) {
        return Uri.parse("package:" + context.getPackageName());
    }

    /**
     * 跳轉(zhuǎn)設(shè)置界面
     */
    public static void gotoSetting(@NonNull Activity activity) {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(getPackageNameUri(activity));
        activity.startActivityForResult(intent, REQUEST_SETTING_CODE);
    }

    public static void gotoSetting(@NonNull Fragment fragment) {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(getPackageNameUri(fragment.getContext()));
        fragment.startActivityForResult(intent, REQUEST_SETTING_CODE);
    }

    /**
     * 鎖定屏幕方向
     */
    public static void lockScreenOrientation(@NonNull Activity activity) {
        try {
            // 獲取實(shí)際屏幕方向
            int screenOrientation = activity.getResources().getConfiguration().orientation;
            switch (screenOrientation) {
                case Configuration.ORIENTATION_LANDSCAPE:
                    activity.setRequestedOrientation(PermissionUtils.isActivityReverse(activity) ?
                            ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE :
                            ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
                case Configuration.ORIENTATION_PORTRAIT:
                    activity.setRequestedOrientation(PermissionUtils.isActivityReverse(activity) ?
                            ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT :
                            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
                default:
                    break;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Activity是否反方向旋轉(zhuǎn)
     */
    public static boolean isActivityReverse(@NonNull Activity activity) {
        int activityRotation;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            activityRotation = activity.getDisplay().getRotation();
        } else {
            activityRotation = activity.getWindowManager().getDefaultDisplay().getRotation();
        }
        switch (activityRotation) {
            case Surface.ROTATION_180:
            case Surface.ROTATION_270:
                return true;
            case Surface.ROTATION_0:
            case Surface.ROTATION_90:
            default:
                return false;
        }
    }
}

PermissionsFragment.java

/**
 * 權(quán)限請(qǐng)求Fragment
 */
public class PermissionsFragment extends Fragment {
    public static final String REQUEST_CODE = "requestCode"; //請(qǐng)求碼
    public static final String PARAM_PERMISSIONS = "permissionList";

    /**
     * 權(quán)限結(jié)果回調(diào)
     */
    @Nullable
    private OnPermissionCallback mOnPermissionCallback;
    /**
     * 設(shè)置結(jié)果回調(diào)
     */
    @Nullable
    private OnSettingsCallback mOnSettingsCallback;
    /**
     * 獲取當(dāng)前請(qǐng)求的屏幕方向
     */
    private int mScreenOrientation;
    private PermissionHelper mHelper;
    private ArrayList<String> allPermissionList;
    private int mRequestCode;
    private static final ArrayList<Integer> requestCodeList = new ArrayList<>();

    public static void launch(@NonNull FragmentActivity activity, @NonNull ArrayList<String> permissionList, @NonNull PermissionHelper helper,
                              @NonNull OnPermissionCallback onPermissionCallback, @Nullable OnSettingsCallback onSettingsCallback) {
        PermissionsFragment fragment = new PermissionsFragment();
        Bundle bundle = new Bundle();
        int requestCode = generateCode();
        bundle.putInt(REQUEST_CODE, requestCode);
        bundle.putStringArrayList(PARAM_PERMISSIONS, permissionList);
        fragment.setArguments(bundle);
        fragment.setRetainInstance(true);
        fragment.setCallback(onPermissionCallback, onSettingsCallback);
        fragment.setHelper(helper);
        fragment.attachActivity(activity);
    }

    private void setHelper(PermissionHelper helper) {
        mHelper = helper;
    }

    /**
     * 隨機(jī)生成requestCode
     */
    private static int generateCode() {
        int requestCode = new Random().nextInt(65536);
        while (requestCodeList.contains(requestCode)) {
            requestCode = new Random().nextInt(65536);
        }
        requestCodeList.add(requestCode);
        return requestCode;
    }

    /**
     * 綁定Activity
     */
    private void attachActivity(@NonNull FragmentActivity activity) {
        activity.getSupportFragmentManager().beginTransaction().add(this, this.toString()).commitAllowingStateLoss();
    }

    /**
     * 解綁Activity
     */
    private void detachActivity(@NonNull FragmentActivity activity) {
        activity.getSupportFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss();
    }

    /**
     * 設(shè)置權(quán)限監(jiān)聽回調(diào)監(jiān)聽
     */
    public void setCallback(@NonNull OnPermissionCallback onPermissionCallback, @Nullable OnSettingsCallback onSettingsCallback) {
        mOnPermissionCallback = onPermissionCallback;
        mOnSettingsCallback = onSettingsCallback;
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        FragmentActivity activity = getActivity();
        if (activity == null) {
            return;
        }

        Bundle bundle = getArguments();
        if (bundle != null) {
            ArrayList<String> permissionList = bundle.getStringArrayList(PARAM_PERMISSIONS);
            if (permissionList == null || permissionList.isEmpty()) {
                return;
            }
            mRequestCode = bundle.getInt(REQUEST_CODE);
            allPermissionList = permissionList;
        }

        // 獲取請(qǐng)求的屏幕方向
        mScreenOrientation = activity.getRequestedOrientation();
        // 如果未指定屏幕方向,就鎖定當(dāng)前屏幕方向
        if (mScreenOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
            PermissionUtils.lockScreenOrientation(activity);
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        FragmentActivity activity = getActivity();
        if (activity == null) {
            return;
        }
        // 如果當(dāng)前屏幕方向是未指定,同時(shí)當(dāng)前請(qǐng)求的屏幕方向是橫屏或豎屏?xí)r,則屏幕方向切換為未指定方向模式
        if (mScreenOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED &&
                activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        requestPermissions(allPermissionList.toArray(new String[allPermissionList.size() - 1]), mRequestCode);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NotNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (permissions.length == 0 || grantResults.length == 0) {
            return;
        }
        if (requestCode == mRequestCode) {
            FragmentActivity activity = getActivity();
            if (activity == null) {
                return;
            }
            ArrayList<String> grantedList = new ArrayList<>(); //已授予權(quán)限
            ArrayList<String> deniedList = new ArrayList<>(); //已拒絕權(quán)限
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                    deniedList.add(permissions[i]);
                } else {
                    grantedList.add(permissions[i]);
                }
            }
            requestCodeList.remove((Integer) mRequestCode);
            OnPermissionCallback onPermissionCallback = mOnPermissionCallback;
            mOnPermissionCallback = null;
            OnSettingsCallback onSettingsCallback = mOnSettingsCallback;
            mOnSettingsCallback = null;
            PermissionHelper helper = mHelper;
            mHelper = null;
            detachActivity(activity);

            boolean allGranted = grantedList.size() == permissions.length;
            if (allGranted) {
                onPermissionCallback.onGranted(true, grantedList);
                return;
            }

            boolean deniedNever = PermissionUtils.isDeniedNeverPermissions(activity, deniedList);
            onPermissionCallback.onDenied(deniedNever, deniedList);

            if (grantedList.size() > 0) {
                onPermissionCallback.onGranted(false, grantedList);
            }

            if (deniedNever) {
                helper.showPermissionSettingDialog(activity, deniedList, onSettingsCallback);
            } else if (deniedList.size() > 0) {
                helper.showPermissionInfoDialog(activity, deniedList, onPermissionCallback, onSettingsCallback);
            }
        }
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mOnPermissionCallback = null;
    }
}
/**
 * 權(quán)限結(jié)果回調(diào)
 */
public interface OnPermissionCallback {

    /**
     * 權(quán)限授予時(shí)回調(diào)
     *
     * @param allGranted  是否全部被授予
     * @param permissions 已授予權(quán)限
     */
    void onGranted(boolean allGranted, @NonNull ArrayList<String> permissions);

    /**
     * 權(quán)限拒絕時(shí)回調(diào)
     *
     * @param deniedNever 是否拒絕且不再詢問
     * @param permissions 被拒絕權(quán)限
     */
    void onDenied(boolean deniedNever, @NonNull ArrayList<String> permissions);
}
public interface OnSettingsCallback {
    void onResult();
}

PermissionHelper.java

/**
 * 權(quán)限請(qǐng)求類
 */
public class PermissionHelper {

    @Nullable
    private final FragmentActivity mActivity;
    @NonNull
    private final ArrayList<String> mPermissions = new ArrayList<>();

    private PermissionHelper(FragmentActivity activity) {
        mActivity = activity;
    }

    /**
     * 設(shè)置請(qǐng)求對(duì)象
     */
    public static PermissionHelper with(FragmentActivity activity) {
        return new PermissionHelper(activity);
    }

    public static PermissionHelper with(Fragment fragment) {
        FragmentActivity activity = fragment.getActivity();
        return new PermissionHelper(activity);
    }

    public PermissionHelper permissions(@NonNull ArrayList<String> permissionList) {
        mPermissions.addAll(permissionList);
        return this;
    }

    /**
     * 請(qǐng)求權(quán)限
     */
    public void request(@NonNull OnPermissionCallback onPermissionCallback) {
        request(onPermissionCallback, null);
    }

    public void request(@NonNull OnPermissionCallback onPermissionCallback, @Nullable OnSettingsCallback onSettingsCallback) {
        if (mActivity == null || mActivity.isFinishing() || mActivity.isDestroyed()) {
            return;
        }
        showPermissionInfoDialog(mActivity, mPermissions, onPermissionCallback, onSettingsCallback);
    }

    /**
     * 權(quán)限說明彈窗
     */
    public void showPermissionInfoDialog(@NonNull FragmentActivity activity, @NonNull ArrayList<String> allPermissions, @NonNull OnPermissionCallback onPermissionCallback) {
        showPermissionInfoDialog(activity, allPermissions, onPermissionCallback, null);
    }

    public void showPermissionInfoDialog(FragmentActivity activity, @NonNull ArrayList<String> allPermissions, @NonNull OnPermissionCallback onPermissionCallback, @Nullable OnSettingsCallback onSettingsCallback) {
        if (activity == null || activity.isFinishing() || activity.isDestroyed()) {
            return;
        }
        ArrayList<String> permissionList = PermissionUtils.getDeniedPermissions(activity, allPermissions);
        String title = "權(quán)限說明";
        String message = "使用此功能需要先授予:" + listToString(getPermissionNames(permissionList));
        new AlertDialog.Builder(activity)
                .setTitle(title)
                .setMessage(message)
                .setCancelable(false)
                .setPositiveButton("授予", (dialog, which) -> {
                    dialog.dismiss();
                    PermissionsFragment.launch(activity, permissionList, this, onPermissionCallback, onSettingsCallback);
                })
                .setNegativeButton("取消", (dialog, which) -> {
                })
                .show();
    }

    /**
     * 獲取權(quán)限名
     */
    public static ArrayList<String> getPermissionNames(ArrayList<String> permissions) {
        ArrayList<String> permissionNames = new ArrayList<>();
        for (String permission : permissions) {
            switch (permission) {
                case Manifest.permission.CAMERA:
                    permissionNames.add("相機(jī)權(quán)限");
                    break;
                case Manifest.permission.ACCESS_FINE_LOCATION:
                    permissionNames.add("定位權(quán)限");
                    break;
                case Manifest.permission.CALL_PHONE:
                    permissionNames.add("撥號(hào)權(quán)限");
                    break;
                default:
                    break;
            }
        }
        return permissionNames;
    }

    /**
     * ArrayList轉(zhuǎn)String
     */
    public static String listToString(ArrayList<String> permissionNames) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0, size = permissionNames.size(); i < size; i++) {
            if (i == size - 1) {
                builder.append(permissionNames.get(i));
            } else {
                builder.append(permissionNames.get(i)).append("、");
            }
        }
        return builder.toString();
    }

    /**
     * 權(quán)限提醒彈窗
     */
    public void showPermissionSettingDialog(FragmentActivity activity, ArrayList<String> permissionList, @Nullable OnSettingsCallback onSettingsCallback) {
        if (activity == null || activity.isFinishing() || activity.isDestroyed()) {
            return;
        }
        String title = "權(quán)限提醒";
        String message = "獲取權(quán)限失敗,請(qǐng)手動(dòng)授予:" + listToString(getPermissionNames(permissionList));
        new AlertDialog.Builder(activity)
                .setTitle(title)
                .setMessage(message)
                .setPositiveButton("前往授權(quán)", (dialog, which) -> {
                    dialog.dismiss();
                    SettingsFragment.launch(activity, onSettingsCallback);
                })
                .show();
    }
}

SettingsFragment.java

/**
 * 跳轉(zhuǎn)設(shè)置頁(yè)Fragment
 */
public class SettingsFragment extends Fragment {

    @Nullable
    private OnSettingsCallback mCallBack;

    public static void launch(@NonNull FragmentActivity activity, @Nullable OnSettingsCallback callback) {
        SettingsFragment fragment = new SettingsFragment();
        fragment.setRetainInstance(true);
        if (callback != null)
            fragment.setCallback(callback);
        fragment.attachActivity(activity);
    }

    /**
     * 設(shè)置回調(diào)
     */
    public void setCallback(@NonNull OnSettingsCallback callback) {
        mCallBack = callback;
    }

    /**
     * 綁定Activity
     */
    private void attachActivity(@NonNull FragmentActivity activity) {
        activity.getSupportFragmentManager().beginTransaction().add(this, this.toString()).commitAllowingStateLoss();
    }

    /**
     * 解綁Activity
     */
    private void detachActivity(@NonNull FragmentActivity activity) {
        activity.getSupportFragmentManager().beginTransaction().remove(this).commitAllowingStateLoss();
    }

    @Override
    public void onResume() {
        super.onResume();
        PermissionUtils.gotoSetting(this);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PermissionUtils.REQUEST_SETTING_CODE) {
            OnSettingsCallback callback = mCallBack;
            mCallBack = null;
            if (callback != null) {
                callback.onResult();
            }
        }

        FragmentActivity activity = getActivity();
        if (activity == null) {
            return;
        }
        detachActivity(activity);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mCallBack = null;
    }
}

Activity中使用

{
    ArrayList<String> permissionList = new ArrayList<>();
    permissionList.add(Manifest.permission.CAMERA);
    permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
    permissionList.add(Manifest.permission.CALL_PHONE);

    if (PermissionUtils.isGrantedPermissions(mContext, permissionList)) {
        Toast.makeText(mContext, "權(quán)限都通過了", Toast.LENGTH_SHORT).show();
    } else {
        PermissionHelper.with(this)
                .permissions(permissionList)
                .request(new OnPermissionCallback() {
                    @Override
                    public void onGranted(boolean allGranted, @NonNull ArrayList<String> permissions) {
                        if (allGranted) {
                            Toast.makeText(mContext, "權(quán)限全部通過", Toast.LENGTH_SHORT).show();
                        }
                        Log.e("TAG", "onGranted: " + allGranted + " - " + permissions);
                    }

                    @Override
                    public void onDenied(boolean deniedNever, @NonNull ArrayList<String> permissions) {
                        if (deniedNever) {
                            Toast.makeText(mContext, "權(quán)限拒絕且不再詢問", Toast.LENGTH_SHORT).show();
                        }
                        Log.e("TAG", "onDenied: " + deniedNever + " - " + permissions);
                    }
                }, new OnSettingsCallback() {
                    @Override
                    public void onResult() {
                        Log.e("TAG", "onResult");
                    }
                });
    }
}

Fragment中使用

ArrayList<String> permissionList = new ArrayList<>();
permissionList.add(Manifest.permission.CAMERA);
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
permissionList.add(Manifest.permission.CALL_PHONE);

if (PermissionUtils.isGrantedPermissions(mContext, permissionList)) {
    Toast.makeText(mContext, "權(quán)限都通過了", Toast.LENGTH_SHORT).show();
} else {
    PermissionHelper.with(this)
        .permissions(permissionList)
        .request(new OnPermissionCallback() {
            @Override
            public void onGranted(boolean allGranted, @NonNull ArrayList<String> permissions) {
                if (allGranted) {
                    Toast.makeText(mContext, "權(quán)限全部通過", Toast.LENGTH_SHORT).show();
                }
                Log.e("TAG", "onGranted: " + allGranted + " - " + permissions);
            }

            @Override
            public void onDenied(boolean deniedNever, @NonNull ArrayList<String> permissions) {
                if (deniedNever) {
                    Toast.makeText(mContext, "權(quán)限拒絕且不再詢問", Toast.LENGTH_SHORT).show();
                }
                Log.e("TAG", "onDenied: " + deniedNever + " - " + permissions);
            }
        }, new OnSettingsCallback() {
            @Override
            public void onResult() {
                Log.e("TAG", "onResult");
            }
        });
}

源碼

到了這里,關(guān)于Android 基于Fragment的權(quán)限封裝的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android Permission 權(quán)限申請(qǐng),EasyPermission和其他三方庫(kù)

    在Android的實(shí)際開發(fā)中,經(jīng)常會(huì)因?yàn)樾枨蟮膶?shí)現(xiàn),需要申請(qǐng)用戶權(quán)限。 今天總結(jié)下Android中常用的權(quán)限申請(qǐng)。 一、基本介紹和流程 Android中的權(quán)限申請(qǐng)是通過應(yīng)用程序與操作系統(tǒng)之間的交互實(shí)現(xiàn)的。在Android中,每個(gè)應(yīng)用程序都被賦予了一組預(yù)定義的權(quán)限,這些權(quán)限定義了應(yīng)用程

    2024年02月13日
    瀏覽(15)
  • 【Android】android.permission.INTERACT_ACROSS_USERS_FULL是什么權(quán)限及其作用是什么

    android.permission.INTERACT_ACROSS_USERS_FULL 權(quán)限允許應(yīng)用程序在所有用戶之間進(jìn)行交互。這包括在其他用戶的應(yīng)用程序中創(chuàng)建活動(dòng)、發(fā)送廣播和執(zhí)行其他操作。 此權(quán)限僅適用于系統(tǒng)應(yīng)用程序和具有特殊權(quán)限的應(yīng)用程序。如果您需要此權(quán)限,請(qǐng)?jiān)谀膽?yīng)用程序的清單文件中聲明它。 以

    2024年02月11日
    瀏覽(28)
  • 【flutter】使用permission_handler配置android和 iOS的權(quán)限

    flutter在pub.flutter-io.cn插件庫(kù)中有很多的關(guān)于權(quán)限配置的插件,但是就我個(gè)人而言,比較推薦使用permission_handler這個(gè)插件。當(dāng)我們打開permission_handler時(shí)候,往往新手小白會(huì)因?yàn)樗墓倬W(wǎng)文檔而弄的一頭霧水,權(quán)限配置往往涉及到android和ios兩個(gè)方向的相關(guān)知識(shí),有可能大多數(shù)人就

    2024年02月12日
    瀏覽(24)
  • 關(guān)于android11,12權(quán)限問題Unable to decode stream: open failed: EACCES (Permission denied)

    第一次發(fā)博客 這個(gè)問題是我在制作一款app時(shí)發(fā)現(xiàn)的,我本來想在一個(gè)textview中加入一個(gè)圖片 但是總是報(bào)錯(cuò) E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20230129_123518.jpg: open failed: EACCES (Permission denied) 我在瀏覽了大多數(shù)關(guān)于這個(gè)問題的討論和

    2024年02月07日
    瀏覽(87)
  • Android權(quán)限列表(基于Android 14)

    權(quán)限的目的為了保護(hù)用戶隱私,應(yīng)用在訪問一些敏感數(shù)據(jù)時(shí),必須事先取得用戶授權(quán)后才能使用,比如:比如讀取sdcard、訪問通訊錄等。 在Android6.0之前的設(shè)備上,系統(tǒng)不會(huì)提醒用戶正在獲取的權(quán)限。一旦安裝應(yīng)用,就意味著該應(yīng)用所需的所有權(quán)限均已經(jīng)得到授權(quán)。在這種情

    2024年02月16日
    瀏覽(20)
  • Android Fragment動(dòng)畫實(shí)現(xiàn)

    在 Android 中,你可以使用 FragmentTransaction 來實(shí)現(xiàn) Fragment 的動(dòng)畫效果。這允許你在添加、替換或移除 Fragment 時(shí)應(yīng)用動(dòng)畫,從而改善用戶體驗(yàn)。下面是如何實(shí)現(xiàn) Fragment 動(dòng)畫的基本步驟: 1. 創(chuàng)建兩個(gè) Fragment: 首先,創(chuàng)建兩個(gè) Fragment,例如 FragmentA 和 FragmentB。這些 Fragment 將被用于

    2024年02月09日
    瀏覽(21)
  • Android 中 Fragment判空

    1. 判斷 Fragment 是否已經(jīng)被添加到 Activity 中,可以通過 Fragment 的 isAdded() 方法來判斷。 2. 判斷 Fragment 的 View 是否已經(jīng)被創(chuàng)建,可以通過 Fragment 的 getView() 方法來判斷。 3. 判斷 Fragment 是否已經(jīng)被銷毀,可以通過 Fragment 的 isDetached() 或 isRemoving() 方法來判斷。 示例: if (fragmen

    2024年02月11日
    瀏覽(45)
  • Xamarin.Android中的Fragment

    一般而言,會(huì)在 activity 中添加一個(gè)加載 fragment 的方法。通過點(diǎn)擊菜單的按鈕,加載不同的 fragment 。其樣子一般是這樣的: 在 fragment 中往往通過工廠模式,提供及返回實(shí)例 非常簡(jiǎn)單,因?yàn)閒ragment一定是要寄存到某個(gè)activity中。因此直接使用如下代碼: 通過 FragmentManager 查找

    2024年02月10日
    瀏覽(27)
  • android - fragment 數(shù)據(jù)丟失?狀態(tài)丟失?

    最佳答案 一些狀態(tài)丟失的例子: 1. ?假設(shè)您有一個(gè)按鈕和一個(gè) TextView 。在代碼中,你已經(jīng)定義了初始值為 0 的整數(shù) i,它通過單擊按鈕遞增 1,并且它的值顯示在 TextView 中。假設(shè)你已經(jīng)按下按鈕 5 次,那么 textview 將被設(shè)置為 0。也就是說? Integer 在屏幕變化時(shí)丟失了它的值 。

    2024年02月10日
    瀏覽(25)
  • Android Navigation 導(dǎo)航切換fragment用法

    對(duì)于Android Navigation組件的導(dǎo)航到Fragment,您可以按照以下步驟操作: 首先,在您的項(xiàng)目的build.gradle文件中添加Navigation依賴: 在你的res目錄下的navigation文件夾中創(chuàng)建一個(gè)nav_graph.xml文件,并定義您的導(dǎo)航圖。 在您的布局文件中,添加NavHostFragment作為導(dǎo)航的目標(biāo)。 在您的Activi

    2024年02月12日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包