帖子

[demo分享] 【经验分享】Demo迁移到Android Studio上(附Demo)

[复制链接]

该用户从未签到

15422  楼主| youngZ 发表于 2016-11-29 17:05:10 1#
由于直接使用Android Studio导入Eclipse项目和实际Android Studio的项目结构不一样,所以用Android Studio新建了一个项目,直接替换了项目内的java目录,Res目录,libs目录及AndroidManifest文件,将assets目录拷贝到main目录下,并新建jniLibs目录用于放so文件。文件替换后需要在app下的build.gradle中修改 applicationId及增加sourceSet

gradle

gradle

这是运行程序虽然没有问题,但是会发现在6.0以上的手机点进Demo 程序操作会打印没有获取相关权限的日志,页面也会提示错误码,主要是在6.0以上的系统中权限还需要再次申请授权,
  1. package com.iflytek.util;

  2. import android.Manifest;
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.content.DialogInterface;
  6. import android.content.Intent;
  7. import android.content.pm.PackageManager;
  8. import android.net.Uri;
  9. import android.provider.Settings;
  10. import android.support.annotation.NonNull;
  11. import android.support.v4.app.ActivityCompat;
  12. import android.util.Log;
  13. import android.widget.Toast;


  14. import com.iflytek.voicedemo.R;

  15. import java.util.ArrayList;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;

  19. /**
  20. * Created by qianxiaoai on 2016/7/7.
  21. */
  22. public class PermissionUtils {

  23.     private static final String TAG = PermissionUtils.class.getSimpleName();
  24.     public static final int CODE_RECORD_AUDIO = 0;
  25.     public static final int CODE_READ_PHONE_STATE = 1;
  26.     public static final int CODE_ACCESS_FINE_LOCATION = 2;
  27.     public static final int CODE_READ_EXTERNAL_STORAGE = 3;
  28.     public static final int CODE_WRITE_EXTERNAL_STORAGE = 4;
  29.     public static final int CODE_MULTI_PERMISSION = 100;

  30.     public static final String PERMISSION_RECORD_AUDIO = Manifest.permission.RECORD_AUDIO;
  31.     public static final String PERMISSION_READ_PHONE_STATE = Manifest.permission.READ_PHONE_STATE;
  32.     public static final String PERMISSION_ACCESS_FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
  33.     public static final String PERMISSION_READ_EXTERNAL_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE;
  34.     public static final String PERMISSION_WRITE_EXTERNAL_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
  35.     public static final String PERMISSION_READ_CONTACTS = Manifest.permission.READ_CONTACTS;

  36.     private static final String[] requestPermissions = {
  37.             PERMISSION_RECORD_AUDIO,
  38.             PERMISSION_READ_PHONE_STATE,
  39.             PERMISSION_ACCESS_FINE_LOCATION,
  40.             PERMISSION_READ_EXTERNAL_STORAGE,
  41.             PERMISSION_WRITE_EXTERNAL_STORAGE,
  42.             PERMISSION_READ_CONTACTS
  43.     };

  44.     public interface PermissionGrant {
  45.         void onPermissionGranted(int requestCode);
  46.     }

  47.     /**
  48.      * Requests permission.
  49.      *
  50.      * @param activity
  51.      * @param requestCode request code, e.g. if you need request CAMERA permission,parameters is PermissionUtils.CODE_CAMERA
  52.      */
  53.     public static void requestPermission(final Activity activity, final int requestCode, PermissionGrant permissionGrant) {
  54.         if (activity == null) {
  55.             return;
  56.         }

  57.         Log.i(TAG, "requestPermission requestCode:" + requestCode);
  58.         if (requestCode < 0 || requestCode >= requestPermissions.length) {
  59.             Log.w(TAG, "requestPermission illegal requestCode:" + requestCode);
  60.             return;
  61.         }

  62.         final String requestPermission = requestPermissions[requestCode];

  63.         //如果是6.0以下的手机,ActivityCompat.checkSelfPermission()会始终等于PERMISSION_GRANTED,
  64.         // 但是,如果用户关闭了你申请的权限,ActivityCompat.checkSelfPermission(),会导致程序崩溃(java.lang.RuntimeException: Unknown exception code: 1 msg null),
  65.         // 你可以使用try{}catch(){},处理异常,也可以在这个地方,低于23就什么都不做,
  66.         // 个人建议try{}catch(){}单独处理,提示用户开启权限。
  67. //        if (Build.VERSION.SDK_INT < 23) {
  68. //            return;
  69. //        }

  70.         int checkSelfPermission;
  71.         try {
  72.             checkSelfPermission = ActivityCompat.checkSelfPermission(activity, requestPermission);
  73.         } catch (RuntimeException e) {
  74.             Toast.makeText(activity, "please open this permission", Toast.LENGTH_SHORT)
  75.                     .show();
  76.             Log.e(TAG, "RuntimeException:" + e.getMessage());
  77.             return;
  78.         }

  79.         if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
  80.             Log.i(TAG, "ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED");


  81.             if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
  82.                 Log.i(TAG, "requestPermission shouldShowRequestPermissionRationale");
  83.                 shouldShowRationale(activity, requestCode, requestPermission);

  84.             } else {
  85.                 Log.d(TAG, "requestCameraPermission else");
  86.                 ActivityCompat.requestPermissions(activity, new String[]{requestPermission}, requestCode);
  87.             }

  88.         } else {
  89.             Log.d(TAG, "ActivityCompat.checkSelfPermission ==== PackageManager.PERMISSION_GRANTED");
  90.             Toast.makeText(activity, "opened:" + requestPermissions[requestCode], Toast.LENGTH_SHORT).show();
  91.             permissionGrant.onPermissionGranted(requestCode);
  92.         }
  93.     }

  94.     private static void requestMultiResult(Activity activity, String[] permissions, int[] grantResults, PermissionGrant permissionGrant) {

  95.         if (activity == null) {
  96.             return;
  97.         }

  98.         //TODO
  99.         Log.d(TAG, "onRequestPermissionsResult permissions length:" + permissions.length);
  100.         Map<String, Integer> perms = new HashMap<>();

  101.         ArrayList<String> notGranted = new ArrayList<>();
  102.         for (int i = 0; i < permissions.length; i++) {
  103.             Log.d(TAG, "permissions: [i]:" + i + ", permissions[i]" + permissions[i] + ",grantResults[i]:" + grantResults[i]);
  104.             perms.put(permissions[i], grantResults[i]);
  105.             if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
  106.                 notGranted.add(permissions[i]);
  107.             }
  108.         }

  109.         if (notGranted.size() == 0) {
  110.             Toast.makeText(activity, "all permission success" + notGranted, Toast.LENGTH_SHORT)
  111.                     .show();
  112.             permissionGrant.onPermissionGranted(CODE_MULTI_PERMISSION);
  113.         } else {
  114.             openSettingActivity(activity, "those permission need granted!");
  115.         }

  116.     }


  117.     /**
  118.      * 一次申请多个权限
  119.      */
  120.     public static void requestMultiPermissions(final Activity activity, PermissionGrant grant) {

  121.         final List<String> permissionsList = getNoGrantedPermission(activity, false);
  122.         final List<String> shouldRationalePermissionsList = getNoGrantedPermission(activity, true);

  123.         //TODO checkSelfPermission
  124.         if (permissionsList == null || shouldRationalePermissionsList == null) {
  125.             return;
  126.         }
  127.         Log.d(TAG, "requestMultiPermissions permissionsList:" + permissionsList.size() + ",shouldRationalePermissionsList:" + shouldRationalePermissionsList.size());

  128.         if (permissionsList.size() > 0) {
  129.             ActivityCompat.requestPermissions(activity, permissionsList.toArray(new String[permissionsList.size()]),
  130.                     CODE_MULTI_PERMISSION);
  131.             Log.d(TAG, "showMessageOKCancel requestPermissions");

  132.         } else if (shouldRationalePermissionsList.size() > 0) {
  133.             showMessageOKCancel(activity, "should open those permission",
  134.                     new DialogInterface.OnClickListener() {
  135.                         @Override
  136.                         public void onClick(DialogInterface dialog, int which) {
  137.                             ActivityCompat.requestPermissions(activity, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]),
  138.                                     CODE_MULTI_PERMISSION);
  139.                             Log.d(TAG, "showMessageOKCancel requestPermissions");
  140.                         }
  141.                     });
  142.         } else {
  143.             grant.onPermissionGranted(CODE_MULTI_PERMISSION);
  144.         }

  145.     }


  146.     private static void shouldShowRationale(final Activity activity, final int requestCode, final String requestPermission) {
  147.         //TODO
  148.         String[] permissionsHint = activity.getResources().getStringArray(R.array.permissions);
  149.         showMessageOKCancel(activity, "Rationale: " + permissionsHint[requestCode], new DialogInterface.OnClickListener() {
  150.             @Override
  151.             public void onClick(DialogInterface dialog, int which) {
  152.                 ActivityCompat.requestPermissions(activity,
  153.                         new String[]{requestPermission},
  154.                         requestCode);
  155.                 Log.d(TAG, "showMessageOKCancel requestPermissions:" + requestPermission);
  156.             }
  157.         });
  158.     }

  159.     private static void showMessageOKCancel(final Activity context, String message, DialogInterface.OnClickListener okListener) {
  160.         new AlertDialog.Builder(context)
  161.                 .setMessage(message)
  162.                 .setPositiveButton("OK", okListener)
  163.                 .setNegativeButton("Cancel", null)
  164.                 .create()
  165.                 .show();

  166.     }

  167.     /**
  168.      * @param activity
  169.      * @param requestCode  Need consistent with requestPermission
  170.      * @param permissions
  171.      * @param grantResults
  172.      */
  173.     public static void requestPermissionsResult(final Activity activity, final int requestCode, @NonNull String[] permissions,
  174.                                                 @NonNull int[] grantResults, PermissionGrant permissionGrant) {

  175.         if (activity == null) {
  176.             return;
  177.         }
  178.         Log.d(TAG, "requestPermissionsResult requestCode:" + requestCode);

  179.         if (requestCode == CODE_MULTI_PERMISSION) {
  180.             requestMultiResult(activity, permissions, grantResults, permissionGrant);
  181.             return;
  182.         }

  183.         if (requestCode < 0 || requestCode >= requestPermissions.length) {
  184.             Log.w(TAG, "requestPermissionsResult illegal requestCode:" + requestCode);
  185.             Toast.makeText(activity, "illegal requestCode:" + requestCode, Toast.LENGTH_SHORT).show();
  186.             return;
  187.         }

  188.         Log.i(TAG, "onRequestPermissionsResult requestCode:" + requestCode + ",permissions:" + permissions.toString()
  189.                 + ",grantResults:" + grantResults.toString() + ",length:" + grantResults.length);

  190.         if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  191.             Log.i(TAG, "onRequestPermissionsResult PERMISSION_GRANTED");
  192.             //TODO success, do something, can use callback
  193.             permissionGrant.onPermissionGranted(requestCode);

  194.         } else {
  195.             //TODO hint user this permission function
  196.             Log.i(TAG, "onRequestPermissionsResult PERMISSION NOT GRANTED");
  197.             //TODO
  198.             String[] permissionsHint = activity.getResources().getStringArray(R.array.permissions);
  199.             openSettingActivity(activity,  "Result" + permissionsHint[requestCode]);
  200.         }

  201.     }

  202.     private static void openSettingActivity(final Activity activity, String message) {

  203.         showMessageOKCancel(activity, message, new DialogInterface.OnClickListener() {
  204.             @Override
  205.             public void onClick(DialogInterface dialog, int which) {
  206.                 Intent intent = new Intent();
  207.                 intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  208.                 Log.d(TAG, "getPackageName(): " + activity.getPackageName());
  209.                 Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
  210.                 intent.setData(uri);
  211.                 activity.startActivity(intent);
  212.             }
  213.         });
  214.     }


  215.     /**
  216.      * @param activity
  217.      * @param isShouldRationale true: return no granted and shouldShowRequestPermissionRationale permissions, false:return no granted and !shouldShowRequestPermissionRationale
  218.      * @return
  219.      */
  220.     public static ArrayList<String> getNoGrantedPermission(Activity activity, boolean isShouldRationale) {

  221.         ArrayList<String> permissions = new ArrayList<>();

  222.         for (int i = 0; i < requestPermissions.length; i++) {
  223.             String requestPermission = requestPermissions[i];


  224.             //TODO checkSelfPermission
  225.             int checkSelfPermission = -1;
  226.             try {
  227.                 checkSelfPermission = ActivityCompat.checkSelfPermission(activity, requestPermission);
  228.             } catch (RuntimeException e) {
  229.                 Toast.makeText(activity, "please open those permission", Toast.LENGTH_SHORT)
  230.                         .show();
  231.                 Log.e(TAG, "RuntimeException:" + e.getMessage());
  232.                 return null;
  233.             }

  234.             if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
  235.                 Log.i(TAG, "getNoGrantedPermission ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED:" + requestPermission);

  236.                 if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
  237.                     Log.d(TAG, "shouldShowRequestPermissionRationale if");
  238.                     if (isShouldRationale) {
  239.                         permissions.add(requestPermission);
  240.                     }

  241.                 } else {

  242.                     if (!isShouldRationale) {
  243.                         permissions.add(requestPermission);
  244.                     }
  245.                     Log.d(TAG, "shouldShowRequestPermissionRationale else");
  246.                 }

  247.             }
  248.         }

  249.         return permissions;
  250.     }


  251. }
复制代码
上面代码时申请授权的工具类,可以在MainAtivity中直接调用
  1. PermissionUtils.requestMultiPermissions(this,mPermissionGrant);
复制代码
同时重写
  1. /**
  2.          * Callback received when a permissions request has been completed.
  3.          */
  4.         @Override
  5.         public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions,
  6.                                                                                    @NonNull int[] grantResults) {
  7.                 for(String per:permissions){
  8.                         Log.d("Test","test:::"+per);
  9.                 }
  10.                 Log.d("Test","requestCode:::"+requestCode);
  11.                 PermissionUtils.requestPermissionsResult(this, requestCode, permissions, grantResults, mPermissionGrant);
  12.         }
复制代码
下载Demo后需要将
  1. <font color="#ff0000"><!-- 移动统计分析 -->
  2.         <meta-data
  3.             android:name="IFLYTEK_APPKEY"
  4.             android:value="'your appId'" /></font>
复制代码
中的your appId换成自己的appId






IflytekTest.rar

2.77 MB, 下载次数: 86

Demo

评分

参与人数 2语点 +15 收起 理由
百花 + 10 很给力!
栗子讲究 + 5 很给力!

查看全部评分

smartfrog 发表于 2017-6-15 18:43:02
2#
谢谢楼主的好东西,收藏了
使用道具 举报 回复
1030001816@qq.c 发表于 2018-7-7 17:13:52
3#
谢谢楼主的好东西,收藏了
使用道具 举报 回复