问题
1.动态权限
2.You need to use a Theme.AppCompat theme (or descendant) with this activity
3.高德地图首次打开定位后没有获取位置
解决
1.动态权限 我自己写在了BaseActivity里面处理代码上来
/**
* 权限组
*/
private List<String> mPermissionList = new ArrayList<>();
/**
* 获取权限成功
* 供子类使用
*/
protected void permissionSuccess() {
}
private String permissionName;//权限名字
/**
* 用于申请权限处理
* 子类复写 permissionSuccess
* 用于权限申请成功回调
* permissionName 权限名字
*
* @param permissions
*/
protected void showPermission(String[] permissions, String permissionName) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mPermissionList.clear();
this.permissionName = permissionName;
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
//未授予的权限为空,表示都授予了
if (mPermissionList.isEmpty()) {
permissionSuccess();
} else {
//请求权限方法
//将List转为数组
permissions = mPermissionList.toArray(new String[mPermissionList.size()]);
ActivityCompat.requestPermissions(this, permissions, 1);
}
} else {
permissionSuccess();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 123) {
ActivityCompat.requestPermissions(this, mPermissionList.toArray(new String[mPermissionList.size()]), 1);
}
}
/**
* 申请权限结果的回调
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1: {
// 授权被允许
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permissionSuccess();
} else {
// 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
new MyCustomDialog(this, "缺失权限!", "我们需要您授权" + permissionName + "权限!",
"", "设置权限", new MyCustomDialog.DialogListener() {
@Override
public void onDialogOkListener() {
//权限授予了
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permissionSuccess();
} else {
//请求权限方法
//将List转为数组
if (!shouldShowRequestPermissionRationale(permissions[0])) {
// 跳转到应用设置界面
goToAppSetting();
} else {
showPermission(mPermissionList.toArray(new String[mPermissionList.size()]), permissionName);
}
}
}
@Override
public void onDialogCancelListener() {
//权限授予了
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permissionSuccess();
} else {
//请求权限方法
//将List转为数组
if (!shouldShowRequestPermissionRationale(permissions[0])) {
// 跳转到应用设置界面
goToAppSetting();
} else {
showPermission(mPermissionList.toArray(new String[mPermissionList.size()]), permissionName);
}
}
}
}).show();
}
}
return;
}
}
}
// 跳转到当前应用的设置界面
private void goToAppSetting() {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 123);
}
提示的 Dialog是自己定义的上代码
style
<!--否则会有黑色框框-->
<style name="CircularDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
</style>
java类
package mh.chenbund.com;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StyleRes;
import android.text.TextUtils;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import mh.chenbund.com.base.R;
/**
* @author wavewave
* @CreateDate: 2019-09-06 11:46
* @Description:
* @Version: 1.0
*/
public class MyCustomDialog extends Dialog {
private Context context;
private TextView mMessageView;
private TextView mTitleView;
private TextView mOneLineMessageView;
private TextView mOneLineCenterMessageView;
private TextView mKnowView;
private TextView mCancelView;
private TextView mOkView;
private LinearLayout mTwoButtonView;
private DialogListener mDialogOkListener;
private String title;
private String message;
private String leftButtonText;
private String rightButtonText;
/**
* @param context 上下文对象
* @param title 对话框有两行文字时,标题
* @param message 对话框有两行文字时,提示的内容
* @param leftButtonText 对话框有两个Button时,左面Button的文字,有一个Button时的文字
* @param rightButtonText 有两个文字时右侧的Button的文字,有一个Button时,写null
* @param mDialogOkListener 对话框有两个Button时的点击事件
*/
public MyCustomDialog(Context context, String title, String message, String leftButtonText, String rightButtonText, DialogListener mDialogOkListener) {
super(context, R.style.CircularDialog);
this.context = context;
this.title = title;
this.message = message;
this.mDialogOkListener = mDialogOkListener;
this.leftButtonText = leftButtonText;
this.rightButtonText = rightButtonText;
}
protected MyCustomDialog(@NonNull Context context) {
super(context);
init();
}
protected MyCustomDialog(@NonNull Context context, @StyleRes int themeResId) {
super(context, themeResId);
init();
}
protected MyCustomDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
init();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_dialog_my);
init();
initData();
setCancelable(false);
}
private void initData() {
mTitleView.setText(title);
mMessageView.setText(message);
if (TextUtils.isEmpty(leftButtonText)) {
mCancelView.setVisibility(View.GONE);
}
mCancelView.setText(leftButtonText);
mOkView.setText(rightButtonText);
}
private void init() {
mTitleView = (TextView) findViewById(R.id.dialog_tip_title);
mMessageView = (TextView) findViewById(R.id.dialog_tip_message);
mOneLineMessageView = (TextView) findViewById(R.id.dialog_tip_oneline_message);
mOneLineCenterMessageView = (TextView) findViewById(R.id.dialog_tip_oneline_center_message);
mCancelView = (TextView) findViewById(R.id.dialog_tip_cancel);
mOkView = (TextView) findViewById(R.id.dialog_tip_ok);
mTwoButtonView = (LinearLayout) findViewById(R.id.dialog_two_button);
mCancelView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//左边
if (mDialogOkListener != null) {
mDialogOkListener.onDialogCancelListener();
}
}
});
mOkView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//右边
if (mDialogOkListener != null) {
mDialogOkListener.onDialogOkListener();
}
}
});
}
public interface DialogListener {
void onDialogOkListener();
void onDialogCancelListener();
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="289dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/bg_round_dialog"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/dialog_tip_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingTop="25dp"
android:text="标题"
android:textColor="#333333"
android:textSize="17sp"
android:textStyle="bold" />
<TextView
android:id="@+id/dialog_tip_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:lineSpacingExtra="3dp"
android:paddingLeft="10dp"
android:paddingTop="10dp"
android:paddingRight="10dp"
android:paddingBottom="25dp"
android:text="多大啊"
android:textColor="#333333"
android:textSize="14sp" />
<TextView
android:id="@+id/dialog_tip_oneline_message"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textColor="#333333"
android:textSize="17sp"
android:visibility="gone" />
<TextView
android:id="@+id/dialog_tip_oneline_center_message"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="20dp"
android:textColor="#4A4A4A"
android:textSize="14sp"
android:visibility="gone" />
</LinearLayout>
<View
android:id="@+id/dialog_tip_line"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/dialog_tip_message"
android:background="#dddddd" />
<LinearLayout
android:id="@+id/dialog_two_button"
android:layout_width="match_parent"
android:layout_height="49dp"
android:layout_below="@id/dialog_tip_line"
android:orientation="horizontal">
<TextView
android:id="@+id/dialog_tip_cancel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:clickable="true"
android:gravity="center"
android:padding="10dp"
android:text="左边"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold" />
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="#dddddd" />
<TextView
android:id="@+id/dialog_tip_ok"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:clickable="true"
android:gravity="center"
android:padding="10dp"
android:text="右边"
android:textColor="#ff6b00"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
使用方法
//需要用的权限的时候调用
showPermission(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.CAMERA
}, "定位和存储");
//这个方法是实现BaseActivity里面,用于权限请求成功后做操作
@Override
protected void permissionSuccess() {
super.permissionSuccess();
}
2.处理第二个问题,是因为我当初定义dialog的时候继承了Alterdialog,改成dialog就可以了。
3.定位是通过服务来获取的,打开app就会自动定位,连续定位是有时间间隔的,所以刚打开是没有权限的,没有获取到位置,所以给权限后要重新开启一下定位就ok。
916

被折叠的 条评论
为什么被折叠?



