过CTA认证,相机定位权限不允许开启,加个自定义弹窗,模拟系统定位权限,但允许之后不赋予实际权限。

vendor/mediatek/proprietary/packages/apps/Camera2

其实就是模拟系统弹窗,做个自定义的,用户点允许之后呢下次就不弹了,但是实际没给权限,拒绝之后下次还弹。关键用的存储是SharedPreference

流程:

host/src/com/mediatek/camera/CameraActivity.java

import android.content.SharedPreferences;

在protectedvoid onCreateTasks(Bundle savedInstanceState) {

加入

if (!isLocationAllow()) {
           Intent permissionIntent = new Intent(Intent.ACTION_VIEW);
           permissionIntent.setClass(this, CtaPermissionActivity.class);
           permissionIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                            |Intent.FLAG_ACTIVITY_CLEAR_TOP
                            |Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
           startActivity(permissionIntent);
        }

所用到的方法和变量

public boolean isLocationAllow() {
       SharedPreferences settings = this.getSharedPreferences(FMRADIO_CONFIRM_PREF_NAME,0);
       return settings.getBoolean(CONFIRM_VALUE_KEY, false);
    }
 
   private final String FMRADIO_CONFIRM_PREF_NAME ="ConfirmPrefFile";
    privatefinal String CONFIRM_VALUE_KEY = "mtk_location_confirmed";

创建一个activity文件在

host/src/com/mediatek/camera/CtaPermissionActivity.java

    packagecom.mediatek.camera;
     
    importandroid.app.Activity;
    importandroid.os.Bundle;
    importandroid.content.Intent;
    importandroid.util.Log;
    importandroid.content.Context;
    importandroid.app.AlertDialog;
    importandroid.app.Dialog;
    importandroid.content.DialogInterface;
    importandroid.content.SharedPreferences;
    importandroid.widget.Toast;
    importandroid.view.MotionEvent;
    importandroid.graphics.Color;
    importandroid.view.Gravity;
    importandroid.graphics.drawable.ColorDrawable;
     
    publicclass CtaPermissionActivity extends Activity {
     
        private static final String TAG ="CtaPermissionActivity";
        private final StringFMRADIO_CONFIRM_PREF_NAME = "ConfirmPrefFile";
        private final String CONFIRM_VALUE_KEY ="mtk_location_confirmed";
     
        @Override
        protected void onCreate(BundlesavedInstanceState) {
            super.onCreate(savedInstanceState);
           setContentView(R.layout.layout_cat_permission);
            buildAndShowConfirmDialog();
        }
        
        @Override
       public boolean onTouchEvent(MotionEvent event) {
            return false;
        }
        
        private void buildAndShowConfirmDialog() {
            SharedPreferences settings =getSharedPreferences(FMRADIO_CONFIRM_PREF_NAME, 0);
            SharedPreferences.Editor editor =settings.edit();
            if(!settings.getBoolean(CONFIRM_VALUE_KEY, false)) {
                Dialog dialog = newAlertDialog.Builder(this)
                       .setTitle(R.string.confirm_dialog_title)
                       .setMessage(R.string.confirm_dialog_msg)
                       .setPositiveButton(R.string.confirm_dialog_allow_button,
                                newDialogInterface.OnClickListener() {
                                    public voidonClick(DialogInterface dialog, int whichButton) {
                                        editor.putBoolean(CONFIRM_VALUE_KEY,true);
                                       editor.commit();
                                        finish();
                                    }
                                })
                        .setNegativeButton(R.string.confirm_dialog_deny_button,
                                newDialogInterface.OnClickListener() {
                                    public voidonClick(DialogInterface dialog, int whichButton) {
                                        Toast toast =Toast.makeText(getApplicationContext(), R.string.deny_toast_msg,
                                               Toast.LENGTH_LONG);
                                       toast.show();
                                       editor.putBoolean(CONFIRM_VALUE_KEY, false);
                                       editor.commit();
                                        finish();
                                    }
                                })
                        .create();
     
                dialog.setCanceledOnTouchOutside(false);
                dialog.setCancelable(false);
     
                dialog.show();
            }
       }
    }

这个activity需要注册

host/AndroidManifest.xml

    <activity
               android:name="com.mediatek.camera.CtaPermissionActivity"
                android:theme="@android:style/Theme.Dialog"
               android:clearTaskOnLaunch="true"
               android:screenOrientation="portrait"
               android:label="@string/camera_label"
               android:launchMode="singleTask">
                <intent-filter>
                    <actionandroid:name="android.intent.action.MAIN" />
                </intent-filter>
            </activity>

这个activity的布局文件创建,其实就是空的啥也没有,里面只不过再调用了系统的对话框罢了

host/res/layout/layout_cat_permission.xml

    <?xmlversion="1.0" encoding="utf-8"?>
    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
     
    </LinearLayout>

所需要的字符串加在

host/res/values/strings.xml

host/res/values-zh-rCN/strings.xml

    <stringname="confirm_dialog_title">Security warning</string>
        <stringname="confirm_dialog_msg">Camera is trying to obtain your currentposition.</string>
        <stringname="confirm_dialog_allow_button">Allow</string>
        <string name="confirm_dialog_deny_button">Deny</string>
        <stringname="deny_toast_msg">Camera is denied to obtainlocation.</string>
     
    <stringname="confirm_dialog_title">“安全提醒” </string>
        <stringname="confirm_dialog_msg">“相机会尝试取得您的位置资讯以供功能正常运行”</string>
        <string name="confirm_dialog_allow_button">“允许”</string>
        <stringname="confirm_dialog_deny_button">“拒绝”</string>
        <stringname="deny_toast_msg">相机被拒绝用位置资讯</string>

最后一步设置好相机里的管理权限的manger类,就每次开启询问权限的功能

common/src/com/mediatek/camera/common/permission/PermissionManager.java

类似cameraactivity的修改,就是为了万无一时,因为本来这个相机也不会给定位权限。这个只是方便日后确定要加权限功能了那到需要在这个,现在不管允许拒绝都没有功能,

下面也就没必要了

importandroid.content.SharedPreferences;

在方法

publicboolean checkCameraLocationPermissions() {

加入if (!isLocationAllow())return false;

在方法public booleanrequestCameraLocationPermissions() {

加入if (!isLocationAllow()) {

return false;

}

需要的方法和定量

publicboolean isLocationAllow() {

SharedPreferences settings =mActivity.getSharedPreferences(FMRADIO_CONFIRM_PREF_NAME, 0);

returnsettings.getBoolean(CONFIRM_VALUE_KEY, false);

}

private final StringFMRADIO_CONFIRM_PREF_NAME = "ConfirmPrefFile";

private final String CONFIRM_VALUE_KEY ="mtk_location_confirmed";

关键点:

这里的activity复写的

@Override

public boolean onTouchEvent(MotionEventevent) {

return false;

}

就是拦截所有触屏事件都不做处理

SharedPreferences的存储使用

使用SharedPreferences类存储数据时,首先需要调用getSharedPreferences(Stringname,int mode)方法获取实例对象,打开Preferences,名称为setting,如果存在则打开它,否则创建新的Preferences

SharedPreferencessettings = getSharedPreferences(FMRADIO_CONFIRM_PREF_NAME, 0);

由于该对象本身只能获取数据,不能对数据进行存储和修改,因此需要调用SharedPreferences的edit()方法获取到可编辑的

SharedPreferences.Editor editor = settings.edit();

然后就可以传值了,一个key一个value,最后提交

editor.putBoolean(CONFIRM_VALUE_KEY,true);

editor.commit();

同应用其他类调用这个数据的时候

SharedPreferencessettings = this.getSharedPreferences(FMRADIO_CONFIRM_PREF_NAME, 0);

settings.getBoolean(CONFIRM_VALUE_KEY,false);

另外还有常用的俩方法

editor.remove(“name”); //删除一条数据

editor.clear(); //删除所有数据

猜你喜欢

转载自blog.csdn.net/youthking1314/article/details/129621209
今日推荐