首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓RunTime权限

安卓RunTime权限
EN

Stack Overflow用户
提问于 2016-07-10 22:55:41
回答 2查看 1.2K关注 0票数 1

我试图添加运行时权限,以使应用程序与API 23+兼容。我通过了文档,但是当我只包括以下一行时

private final int hasWriteFilePermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

我的应用程序崩溃了,我得到了以下错误:

代码语言:javascript
复制
07-10 20:54:15.571 31479-31479/com.ibm.watson.developer_cloud.android.examples E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                             Process: com.ibm.watson.developer_cloud.android.examples, PID: 31479
                                                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ibm.watson.developer_cloud.android.examples/com.ibm.watson.developer_cloud.android.examples.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3254)
                                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350)
                                                                                                 at android.app.ActivityThread.access$1100(ActivityThread.java:222)
                                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795)
                                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                                 at android.os.Looper.loop(Looper.java:158)
                                                                                                 at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                                              Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                                                                                                 at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:337)
                                                                                                 at android.widget.AbsSpinner.setAdapter(AbsSpinner.java:115)
                                                                                                 at android.widget.Spinner.setAdapter(Spinner.java:554)
                                                                                                 at com.ibm.watson.developer_cloud.android.examples.MainActivity$FragmentTabSTT.addItemsOnSpinnerModels(MainActivity.java:566)
                                                                                                 at com.ibm.watson.developer_cloud.android.examples.MainActivity$FragmentTabSTT.onCreateView(MainActivity.java:190)
                                                                                                 at android.app.Fragment.performCreateView(Fragment.java:2281)
                                                                                                 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:983)
                                                                                                 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1163)
                                                                                                 at android.app.BackStackRecord.run(BackStackRecord.java:793)
                                                                                                 at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1552)
                                                                                                 at android.app.FragmentController.execPendingActions(FragmentController.java:325)
                                                                                                 at android.app.Activity.performStart(Activity.java:6914)
                                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3217)
                                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) 
                                                                                                 at android.app.ActivityThread.access$1100(ActivityThread.java:222) 
                                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795) 
                                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                                 at android.os.Looper.loop(Looper.java:158) 
                                                                                                 at android.app.ActivityThread.main(ActivityThread.java:7229) 
                                                                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

我的代码如下:

代码语言:javascript
复制
public static class FragmentTabSTT extends Fragment implements ISpeechToTextDelegate {
    .
    .
    .
@Override
     public void onAttach(Context context) {
         super.onAttach(context);

         Activity a;

         if (context instanceof Activity){
             a = (Activity) context;
         }

     }



     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                  Bundle savedInstanceState) {
     .
     .
     .
     }
     .
     .
     .
        // One method that requires permission
public ArrayList<String> GetFiles(String DirectoryPath) {

         int hasReadFilesPermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE);

         if (hasReadFilesPermission != PackageManager.PERMISSION_GRANTED) {
             if (!shouldShowRequestPermissionRationale(permission.READ_EXTERNAL_STORAGE)) {
                 showMessageOKCancel("You must give permission to read from storage.",
                         new DialogInterface.OnClickListener() {
                             @Override
                             public void onClick(DialogInterface dialog, int which) {
                                 requestPermissions(new String[] {permission.READ_EXTERNAL_STORAGE},
                                         REQUEST_CODE_ASK_PERMISSIONS);
                             }
                         });
                 return null;
             }

             requestPermissions(new String[] {permission.READ_EXTERNAL_STORAGE},
                     REQUEST_CODE_ASK_PERMISSIONS);
             return null;
         }
         ArrayList<String> MyFiles = new ArrayList<String>();
         File f = new File(DirectoryPath);

         f.mkdirs();
         File[] files = f.listFiles();
         if (files.length == 0)
             return null;
         else {
             for (int i=0; i<files.length; i++)
                 MyFiles.add(files[i].getName());
         }

         return MyFiles;
     }
}

我应该如何检查片段中的权限?是什么导致了这个错误?我该如何解决这个问题?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-10 22:58:02

getActivity()在第一次创建片段时(即,在调用onAttach()之前)返回null

您应该在需要权限之前直接检查它们,而不是将它们保存在最终的类变量中。

票数 3
EN

Stack Overflow用户

发布于 2016-07-10 23:02:31

不要在静态变量中调用它:

代码语言:javascript
复制
@Override
onViewCreated(Bundle savedInstanceState) {
    String[] permissions = new String[]{Manifest.permission.SEND_SMS};
    ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}

为权限添加一个侦听器:

代码语言:javascript
复制
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    // do stuff
}

您将需要从AppCompatFragment继承。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38297162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档