Android 如何从我的应用程序中正确识别AnkiDroid(或任何其他外部应用程序)的文件存储目录?

Android 如何从我的应用程序中正确识别AnkiDroid(或任何其他外部应用程序)的文件存储目录?,android,anki,Android,Anki,我使用AnkiDroid API创建卡并将卡发送到AnkiDroid应用程序()。但有一个问题与通过API发送媒体文件有关。它们存储在外部存储器中,在我的示例中为“/storage/simulated/0/AnkiDroid”。我可以从那里添加和读取文件,但我认为对于其他设备,或者如果我切换到SD卡,这个路径可能会有所不同。问题:如何正确识别应用程序外部存储目录的路径?这里是AnkiDroid项目维护人员 您拥有的路径是AnkiDroid媒体文件的默认路径 AnkiDroid用户可以通过配置修改

我使用AnkiDroid API创建卡并将卡发送到AnkiDroid应用程序()。但有一个问题与通过API发送媒体文件有关。它们存储在外部存储器中,在我的示例中为“/storage/simulated/0/AnkiDroid”。我可以从那里添加和读取文件,但我认为对于其他设备,或者如果我切换到SD卡,这个路径可能会有所不同。问题:如何正确识别应用程序外部存储目录的路径?

这里是AnkiDroid项目维护人员

您拥有的路径是AnkiDroid媒体文件的默认路径

AnkiDroid用户可以通过配置修改此路径,您可能知道:

此设置使用Android的常用设置存储技术存储,出于安全原因,其他应用程序无法访问该技术

我不认为该属性当前暴露于其他应用(),但这是一个有效的用例,因此请在

同时,为了与AnkiDroid的当前和以前版本兼容,我想说您有两个选择:

  • 扫描SD卡,查找一个名为
    的collection.media
    。此文件夹位于AnkiDroid文件夹内,按照惯例,其名称不能更改。如果您发现了几个,请比较上次修改日期并询问用户
  • 设置与上面屏幕截图中的设置类似。想要使用非默认文件夹的用户必须在两个应用程序中都设置该文件夹,这有点不方便,但要求设置并不是件疯狂的事情
    • 注意硬代码!!! 我明白这不是最好的办法。 但这对我很有效

      public ArrayList getExternalFolderPath(String folderName){
      
          ArrayList<String> arrayList = new ArrayList<>();
      
          //get all storages in phone
          File externalStorages[] = getExternalFilesDirs(null);
      
          for (File es: externalStorages){
              String exF = es.toString();
      
              //cut out what don't need
              exF = exF.split("/Android/data")[0];
      
              File file = new File(exF);
              File[] files = file.listFiles();
              for (File f: files){
                  Log.i(TAG, "getAnkiExternalFolder()" + f.toString());
                  //add in array the path
                  if(f.toString().contains(folderName)){
                      arrayList.add(f.toString());
                  }
              }
          }
          return arrayList;
      }
      
      public ArrayList getExternalFolderPath(字符串folderName){
      ArrayList ArrayList=新的ArrayList();
      //在电话中获取所有存储
      文件externalStorages[]=getExternalFilesDirs(null);
      用于(文件es:外部存储){
      字符串exF=es.toString();
      //删掉不需要的东西
      exF=exF.split(“/Android/data”)[0];
      文件文件=新文件(exF);
      File[]files=File.listFiles();
      用于(文件f:文件){
      Log.i(标记“getAnkiExternalFolder()”+f.toString());
      //在路径中添加数组
      if(f.toString().contains(folderName)){
      add(f.toString());
      }
      }
      }
      返回数组列表;
      }
      
      还需要添加一个清单条目

      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      
      
      
      如果API级别为uper 23,则请求用户访问以进行读取:

      我使用示例-“”中的代码,它运行良好,只是它没有发送媒体的方法。我可以将音频文件发送到外部存储器,并为此文件创建链接。但我不知道如何获取程序目录的路径。也许可以通过包名来完成<代码>AddContentApi.getAnkiDroidPackageName(此)我考虑了第一个选项。但手机可能根本没有SD卡。我认为应该给用户选择文件夹的选项。但这个解决方案看起来不太好。实际上我已经换了一款根本没有SD卡的手机,而且我没有留下一款无法在atm机上运行的应用程序,因为它一直引用错误的路径“/storage/simulated/0/AnkiDroid”,这在我的Google Pixel XL上显然是无效的