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(); //删除所有数据