【问题标题】:android-RuntimePermissions sample code not workingandroid-RuntimePermissions 示例代码不起作用
【发布时间】:2017-12-28 10:34:58
【问题描述】:

https://github.com/googlesamples/android-RuntimePermissions/

克隆后,我在 Android Studio 2.3.3 中导入了代码,但应用程序文件夹未显示在 Project>Android 中,并且其他 android 特定选项(如 Android Monitor)也不存在。构建项目不工作。

我的导入方式如下。 File > New > Import Project > android-RuntimePermissions > build.gradle然后点击ok

我已将 Kotlin 插件添加到 android studio,因为该项目具有 Kotlin 模块。

【问题讨论】:

  • 您遇到了什么错误?

标签: java android android-studio intellij-idea


【解决方案1】:

有一个无效的settings.gradle 文件,它只有tries to import Application 模块(它还不是有效的gradle 模块,只要它没有自己的build.gradle 文件)。

在根文件夹settings.gradle 文件中放入以下行:

include ':kotlinApp'

现在不是导入build.gradle 而是导入kotlinApp 文件夹:

文件 -> 打开... -> android-RuntimePermissions-master/kotlinApp

【讨论】:

    【解决方案2】:

    不要打开 repo 的根文件夹尝试打开(文件 -> 打开)应用的 kotlin 文件夹

    如果提示下载kotlin库点击下载

    完成后,等待 gradle 同步完成,之后应用模块将可见,您将能够构建和部署应用

    赞!

    【讨论】:

    • 谢谢它有效。这是什么意思?你能解释一下吗?
    • 应用模块在 Kotlin 中
    • 我只能通过这种方式构建 Kotlin 模块。如何构建 Android 模块?
    【解决方案3】:

    https://github.com/googlesamples/android-RuntimePermissions/

    是一个以Application为模块的android项目的根目录。 打开root android项目如下图

    点击ok按钮打开root project

    但问题是应用程序模块没有 build.gradle 文件。所以它不会作为模块加载。 在 Application 文件夹中创建一个 build.gradle 文件并粘贴以下代码

        apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 26
        buildToolsVersion "26.0.2"
        defaultConfig {
            applicationId "com.example.android.system.runtimepermissions"
            minSdkVersion 15
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile "com.android.support:support-v13:26.0.0"
        compile "com.android.support:appcompat-v7:26.0.0"
        compile 'com.android.support:design:26.0.0'
        testCompile 'junit:junit:4.12'
    }
    repositories {
        mavenCentral()
    }
    

    styles.xml 中有一些关于找不到资源的错误。请更正并使用。

    https://github.com/googlesamples/android-RuntimePermissions/tree/master/kotlinApp

    kotlinApp 是另一个与上述项目无关的文件夹。这是另一个以app为模块的android项目 打开kotlinApp android项目,如下图:

    点击ok按钮打开kotlinAppandroid项目

    简而言之,这个存储库由两个 android 项目组成。一个是根文件夹,另一个是kotlinApp 文件夹

    【讨论】:

      【解决方案4】:

      仅当您想检查运行时权限时,只需运行此代码

      if (ActivityCompat.checkSelfPermission(SplashActivity.this,
                  Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED &&
                  ActivityCompat.checkSelfPermission(SplashActivity.this,
                          Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
              ActivityCompat.requestPermissions((SplashActivity.this),
                      new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_ASK_PERMISSIONS);
          }else{
          //ToDo write your code here which will work once you granted The permission.
         Log.e(TAG,"Permission already granted"); 
          }
      

      对于授予权限的结果

        @NonNull
      @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
          switch (requestCode) {
              case REQUEST_CODE_ASK_PERMISSIONS:
                  if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                      // Permission Granted
      //                    databaseHelper = new DatabaseHelper(getContext());
      //                    getCategory();
                      loadDB();
                  } else if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) &&
                          ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) &&
                          ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CAMERA)) {
                      // Permission Denied
                      AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                      builder.setTitle("Need Storage Permission");
                      builder.setMessage("This app needs storage permission");
                      builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, int which) {
                              dialog.cancel();
      
      
                              ActivityCompat.requestPermissions(getActivity(),
                                      new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
                                              Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, REQUEST_CODE_ASK_PERMISSIONS);
      
      
                          }
                      });
                      builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, int which) {
                              dialog.cancel();
                          }
                      });
                      builder.show();
                  }
                  break;
              default:
                  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
          }
      }
      

      【讨论】:

      • 此示例代码用于检查内部读写权限
      【解决方案5】:

      在 onCreate 方法中调用它 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

              checkForPermission();
          }
      

      将此代码放在 OnCreate 之外,然后根据您的需要修改此代码。这是有效且经过测试的代码

      @RequiresApi(api = Build.VERSION_CODES.KITKAT)
      
      public boolean checkForPermission() {
      
          List<String> permissionsNeeded = new ArrayList<String>();
      
          final List<String> permissionsList = new ArrayList<String>();
      
      
          addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE);
          addPermission(permissionsList,Manifest.permission.READ_PHONE_STATE);
          addPermission(permissionsList,Manifest.permission.CALL_PHONE);
          addPermission(permissionsList,Manifest.permission.RECORD_AUDIO);
          addPermission(permissionsList,Manifest.permission.PROCESS_OUTGOING_CALLS);
          addPermission(permissionsList,Manifest.permission.CAPTURE_AUDIO_OUTPUT);
          addPermission(permissionsList,Manifest.permission.READ_SMS);
      
      
      
          if (permissionsList.size() > 0) {
              if (permissionsNeeded.size() > 0) {
                  // Need Rationale
                  ActivityCompat.requestPermissions(MainActivity.this, permissionsList.toArray(new String[permissionsList.size()]),
                          REQUEST_PERMISSION);
      
                  return true;
              }
              ActivityCompat.requestPermissions(MainActivity.this, permissionsList.toArray(new String[permissionsList.size()]),
                      REQUEST_PERMISSION);
              return false;
          }
      
          return true;
      
      }
      private boolean addPermission(List<String> permissionsList, String permission) {
          if (ContextCompat.checkSelfPermission(MainActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
              permissionsList.add(permission);
              // Check for Rationale Option
              if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission))
                  return false;
          }
          return true;
      }
      
      @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
          switch (requestCode) {
              case REQUEST_PERMISSION: {
                  Map<String, Integer> perms = new HashMap<String, Integer>();
                  // Initial
                  perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                  perms.put(Manifest.permission.READ_EXTERNAL_STORAGE,PackageManager.PERMISSION_GRANTED);
                  perms.put(Manifest.permission.READ_SMS,PackageManager.PERMISSION_GRANTED);
      
                  // Fill with results
                  for (int i = 0; i < permissions.length; i++)
                      perms.put(permissions[i], grantResults[i]);
                  if (perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.READ_EXTERNAL_STORAGE)==PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.READ_SMS)==PackageManager.PERMISSION_GRANTED) {
                      Toast.makeText(MainActivity.this, "You can enjoy all features of app now", Toast.LENGTH_SHORT).show();
                  } else {
                      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                          checkForPermission();
                      }
                  }
      
              }
              break;
              default:
                  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 1970-01-01
        • 2020-12-17
        相关资源
        最近更新 更多