Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将文件从资产复制到SD卡上的文件夹失败_Java_Android_Android Asynctask_Tesseract_Mkdir - Fatal编程技术网

Java 将文件从资产复制到SD卡上的文件夹失败

Java 将文件从资产复制到SD卡上的文件夹失败,java,android,android-asynctask,tesseract,mkdir,Java,Android,Android Asynctask,Tesseract,Mkdir,我正在我的应用程序(Spl!t)中使用tesseract OCR。当我从Eclipse向手机启动应用程序时,eng.traineddata被复制到/storage/simulated/0/Pictures/Receipts/tessdata/。但是当我从市场上安装应用程序时,eng.traineddata文件没有复制到文件夹中。我的代码有问题吗 私有文件getOutputPhotoFile(){ 目录=新文件( 环境 .getExternalStoragePublicDirectory(Envi

我正在我的应用程序(Spl!t)中使用tesseract OCR。当我从Eclipse向手机启动应用程序时,eng.traineddata被复制到/storage/simulated/0/Pictures/Receipts/tessdata/。但是当我从市场上安装应用程序时,eng.traineddata文件没有复制到文件夹中。我的代码有问题吗

私有文件getOutputPhotoFile(){
目录=新文件(
环境
.getExternalStoragePublicDirectory(Environment.DIRECTORY\u图片),
“收据”);
dataPath=directory.getAbsolutePath();
如果(!directory.exists()){
mkdirs()目录;
Toast.makeText(Trans_List.this,“Receipts Folder Created”,Toast.LENGTH_SHORT.show();
File tessDir=新文件(目录,“tessdata”);
如果(!tessDir.exists()){
tessDir.mkdirs();
Toast.makeText(Trans_List.this,“创建的数据文件夹”,Toast.LENGTH_SHORT.show();
文件培训数据=新文件(tessDir,“eng.traineddata”);
如果(!trainingData.exists())
新建CopyLibrary().execute(LANG);
}
}
字符串时间戳=新的SimpleDataFormat(“yyyyMMdd\u HHmmss”)
.格式(新日期());
返回新文件(directory.getPath()+File.separator+“receivement\ux”
+时间戳+“.jpg”);
}   
私有类CopyLibrary扩展了异步任务{
私有void复制文件(输入流输入,输出流输出)
抛出IOException{
字节[]缓冲区=新字节[1024];
int-read;
while((read=in.read(buffer))!=-1)
输出。写入(缓冲区,0,读取);
}
@凌驾
受保护的空doInBackground(字符串…s){
AssetManager AssetManager=getAssets();
String[]files=null;
试一试{
files=assetManager.list(“”);
}捕获(IOE异常){
Log.e(“Spl!t”,“无法获取资产文件列表”);
}
用于(字符串文件名:文件){
InputStream in=null;
OutputStream out=null;
试一试{
in=assetManager.open(文件名);
File outFile=新文件(dataPath+File.separator
+“tessdata”+File.separator,LANG
+“.traineddata”);
out=新文件输出流(输出文件);
复制文件(输入、输出);
in.close();
in=null;
out.flush();
out.close();
Toast.makeText(Trans_List.this,“数据已复制”,Toast.LENGTH_SHORT.show();
out=null;
}捕获(IOE异常){
Log.e(标记“未能复制资产文件”);
}
}
返回null;
}
}

“需要创建数据路径/pictures/receipts/tessdata/eng.trainededdata”--这是不可能的,因为您不能从文件系统根目录(
/
)创建新目录,可能除了在根目录设备上之外。@commonware我的手机已根目录,但我正在使用.getExternalStoragePublicDirectory(Environment.DIRECTORY\u pictures)正在/storage/emulated/0/pictures/下创建目录。这是根文件夹吗?“这是根文件夹吗”--不,但您不会知道
/storage/emulated/0/pictures/
不是
/pictures/receipts/tessdata/eng.traineddata
。您也许可以创建
/storage/simulated/0/pictures/receipts/tessdata/eng.traineddata
。抱歉@commonware,我不明白您的意思?这正是我要将eng.traineddata复制到的路径。
  private File getOutputPhotoFile() {
      directory = new File(
              Environment
                      .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
              "Receipts");
      dataPath = directory.getAbsolutePath();
      if (!directory.exists()) {
          directory.mkdirs();
          Toast.makeText(Trans_List.this, "Receipts Folder Created", Toast.LENGTH_SHORT).show();
          File tessDir = new File(directory, "tessdata");
          if (!tessDir.exists()) {
              tessDir.mkdirs();
          Toast.makeText(Trans_List.this, "Tessdata Folder Created",  Toast.LENGTH_SHORT).show();
              File trainingData = new File(tessDir, "eng.traineddata");
              if(!trainingData.exists())
                  new CopyLibrary().execute(LANG);
          }
      }
      String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss")
              .format(new Date());
      return new File(directory.getPath() + File.separator + "Receipt_"
              + timeStamp + ".jpg");
  }   

private class CopyLibrary extends AsyncTask<String, Void, Void> {

  private void copyFile(InputStream in, OutputStream out)
          throws IOException {
      byte[] buffer = new byte[1024];
      int read;
      while ((read = in.read(buffer)) != -1)
          out.write(buffer, 0, read);
  }

  @Override
  protected Void doInBackground(String... s) {
      AssetManager assetManager = getAssets();
      String[] files = null;
      try {
          files = assetManager.list("");
      } catch (IOException e) {
          Log.e("Spl!t", "Failed to get asset file list.");
      }
      for (String filename : files) {
      InputStream in = null;
          OutputStream out = null;
          try {
              in = assetManager.open(filename);
              File outFile = new File(dataPath + File.separator
                      + "tessdata" + File.separator, LANG
                      + ".traineddata");
              out = new FileOutputStream(outFile);
              copyFile(in, out);
              in.close();
              in = null;
              out.flush();
              out.close();
              Toast.makeText(Trans_List.this, "Tessdata copied", Toast.LENGTH_SHORT).show();
              out = null;
          } catch (IOException e) {
              Log.e(TAG, "Failed to copy asset file");
          }
      }
      return null;
  }
}