https://blog.csdn.net/Android_xue/article/details/78854885 相机申请权限
package com.example.administrator.downrainsun; import android.app.Activity; import android.app.AlertDialog; import android.app.Application; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; public class BaseFragment extends Fragment { private final int mRequestCode = 1024; private RequestPermissionCallBack mRequestPermissionCallBack; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /** * 权限请求结果回调 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); boolean hasAllGranted = true; StringBuilder permissionName = new StringBuilder(); for (String s : permissions) { permissionName = permissionName.append(s + " "); } switch (requestCode) { case mRequestCode: { for (int i = 0; i < grantResults.length; ++i) { if (grantResults[i] == PackageManager.PERMISSION_DENIED) { hasAllGranted = false; //在用户已经拒绝授权的情况下,如果shouldShowRequestPermissionRationale返回false则 // 可以推断出用户选择了“不在提示”选项,在这种情况下需要引导用户至设置页手动授权 if (!ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), permissions[i])) { new AlertDialog.Builder(getActivity()).setTitle("PermissionTest")//设置对话框标题 .setMessage("【用户选择了不再提示按钮,或者系统默认不在提示(如MIUI)。" + "引导用户到应用设置页去手动授权,注意提示用户具体需要哪些权限】" + "获取相关权限失败:" + permissionName + "将导致部分功能无法正常使用,需要到设置页面手动授权")//设置显示的内容 .setPositiveButton("去授权", new DialogInterface.OnClickListener() {//添加确定按钮 @Override public void onClick(DialogInterface dialog, int which) {//确定按钮的响应事件 //TODO Auto-generated method stub Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", com.example.administrator.downrainsun.Application.getContext().getPackageName(), null); intent.setData(uri); startActivity(intent); dialog.dismiss(); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加返回按钮 @Override public void onClick(DialogInterface dialog, int which) {//响应事件 // TODO Auto-generated method stub dialog.dismiss(); } }).setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { mRequestPermissionCallBack.denied(); } }).show();//在按键响应事件中显示此对话框 } else { //用户拒绝权限请求,但未选中“不再提示”选项 mRequestPermissionCallBack.denied(); } break; } } if (hasAllGranted) { mRequestPermissionCallBack.granted(); } } } } /** * 发起权限请求 * * @param context * @param permissions * @param callback */ public void requestPermissions(final Context context, final String[] permissions, RequestPermissionCallBack callback) { this.mRequestPermissionCallBack = callback; StringBuilder permissionNames = new StringBuilder(); for (String s : permissions) { permissionNames = permissionNames.append(s + " "); } //如果所有权限都已授权,则直接返回授权成功,只要有一项未授权,则发起权限请求 boolean isAllGranted = true; for (String permission : permissions) { if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED) { isAllGranted = false; if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, permission)) { new AlertDialog.Builder(getActivity()).setTitle("PermissionTest")//设置对话框标题 .setMessage("【用户曾经拒绝过你的请求,所以这次发起请求时解释一下】" + "您好,需要如下权限:" + permissionNames + " 请允许,否则将影响部分功能的正常使用。")//设置显示的内容 .setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加确定按钮 @Override public void onClick(DialogInterface dialog, int which) {//确定按钮的响应事件 //TODO Auto-generated method stub ActivityCompat.requestPermissions(((Activity) context), permissions, mRequestCode); } }).show();//在按键响应事件中显示此对话框 } else { ActivityCompat.requestPermissions(((Activity) context), permissions, mRequestCode); } break; } } if (isAllGranted) { mRequestPermissionCallBack.granted(); return; } } /** * 权限请求结果回调接口 */ interface RequestPermissionCallBack { /** * 同意授权 */ void granted(); /** * 取消授权 */ void denied(); } }
circleImageview的手动实现()
package com.example.administrator.downrainsun; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; @SuppressLint("AppCompatCustomView") public class CircleImageView extends ImageView { private Paint mPaint = new Paint(); public CircleImageView(Context context) { super(context); } public CircleImageView(Context context, AttributeSet attrs) { super(context, attrs); } public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private Bitmap scaleBitmap(Bitmap bitmap) { float scale = (float) getWidth() / bitmap.getWidth(); Matrix matrix = new Matrix(); matrix.postScale(scale, scale); return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } @Override protected void onDraw(Canvas canvas) { Drawable drawable = getDrawable(); if (drawable != null) { Bitmap rawBitmap = ((BitmapDrawable) drawable).getBitmap(); Bitmap newBitmap = scaleBitmap(rawBitmap); Bitmap circleBitmap = getCircleBitmap(newBitmap); mPaint.reset(); canvas.drawBitmap(circleBitmap, 0, 0, mPaint); } } private Bitmap getCircleBitmap(Bitmap bitmap) { Bitmap circleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_4444); Canvas canvas = new Canvas(circleBitmap); mPaint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); int radius = bitmap.getWidth() / 2; canvas.drawCircle(radius, radius, radius, mPaint); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, 0, 0, mPaint); return circleBitmap; } }
https://blog.csdn.net/harvic880925/article/details/49272285 pupopwindow
https://blog.csdn.net/smile_Running/article/details/97113256 design 库