2014-09-04 2 views
0

한 위치에서 다른 위치로 파일을 복사하려고했습니다. 내 이해에 내 프로그램의 복사 메커니즘이 제대로 작동하지만, 나는 끊임없이 파일 경로 오류가 발생하는 응용 프로그램을 실행할 때. xbmc 앱 내에서 데이터 파일로 작업하고 있습니다.Android 파일 복사 중 : 경로 오류

AssetManager -> CIP 경로 exsit하지 addDefaultAssets /data/data/org.xbmc.xbmc/.xbmc/userdata/guisettings.bak : ENOENT (없음 같은 파일 또는 디렉토리)

: 실패를 열지

문자열 경로에 대한 File 개체를 만들 때 문제가 발생하는 것 같습니다. 다음은 프로그램의 해당 부분에 대한 코드 스 니펫입니다.

위의 오류가 계속 발생해도 계속 액세스합니다. 필자는 File, FileInputStream 및 Uri 라이브러리를 사용하여 파일 경로를 얻으려고했습니다. 쓰기 권한에 문제가 있거나 파일 경로를 올바르게 지정하지 않았습니까? 문제가 코드 내의 다른 곳에있을 경우를 대비하여 전체 솔루션을 게시하고 있습니다.

public class myActivity extends Activity { 
    private static final String TAG = "myActivity.java"; 
    //The package name representing the application directory that is to be accessed 
    String packageName = "org.xbmc.xbmc"; 
    //The input filename to read and copy 
    String inputFileName = "guisettings.bak"; 
    //The output filename to append to 
    String outputFileName = "guisettings.xml"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 
     //Check the status of the external storage 
     if(isExternalReady()) { 
      //The external file system is ready 
      //Start the specific file operation 
      restoreFile(); 
     } else { 
      //Not ready. Create a Broadcast Receiver and wait for the filesystem to mount 
      BroadcastReceiver mExternalInfoReceiver = new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context arg0, Intent intent) { 
        //The external filesystem is now mounted 
        //Start the specific file operation 
        restoreFile(); 
       } 
      }; 
      //Get the IntentFilter Media Mounted 
      IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED); 
      //Specify the filesystem data type 
      filter.addDataScheme("file"); 
      //Register the receiver as "mExternalInfoReceiver" with the Media Mount filter 
      registerReceiver(mExternalInfoReceiver, new IntentFilter(filter)); 
     } 
    } 

    //Restore the specific xml file 
    public void restoreFile() { 
     /* 
     //Get the internal storage of this app (Android/data/com.website.appname/files/) 
     String internalStorage = Environment.getFilesDir(); 
     //Get the external storage path now that it is available 
     String externalStorage = Environment.getExternalStorageDirectory().toString(); 
     //The directory of the file desired 
     String filePath = "Android/data/org.xbmc.xbmc/files/.xbmc/userdata/"; 
     */ 
     //The information of the desired package 
     ApplicationInfo desiredPackage; 
     //Get the path of the application data folder if the application exists 
     try { 
      //Get the info of the desired application package 
      desiredPackage = getPackageInfo(packageName); 
     } catch (Exception e) { 
      //Output the stack trace 
      e.printStackTrace(); 
      //Stop the function 
      return; 
     } 
     //Get the data dir of the package 
     String rootPackageDir = desiredPackage.dataDir; 
     //The path to the file in the package 
     String packageFilePath = "/.xbmc/userdata/"; 
     //Construct the complete path of the input and output files respectively 
     //based on the application path 
     String inputPath = String.format("%s%s%s", rootPackageDir, packageFilePath, inputFileName); 
     String outputPath = String.format("%s%s%s", rootPackageDir, packageFilePath, outputFileName); 
     try { 
      //Copy the input file to the output file 
      if(copyFile(inputPath, outputPath)) { 
       //The file has been successfully copied 
       //Exit the application 
       System.exit(0); 
      } 
     } catch (IOException e) { e.printStackTrace(); return; } 
    } 

    //Is the external storage ready? 
    public boolean isExternalReady() { 
     //Get the current state of the external storage 
     //Check if the state retrieved is equal to MOUNTED 
     Boolean isMounted = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); 
     if(isMounted) { 
      //The external storage is ready 
      return true; 
     } 
     //The external storage is not ready 
     return false; 
    } 

    //Get the data dir of a specific app if it exists 
    public ApplicationInfo getPackageInfo(String packageName) throws PackageNotFoundException { 
     List<ApplicationInfo> packages; 
     PackageManager pm; 
     //Init the package manager as pm 
     pm = getPackageManager(); 
     //Get all installed applications 
     packages = pm.getInstalledApplications(0); 
     //Get the ApplicationInfo as packageInfo from each packages 
     for(ApplicationInfo packageInfo:packages) { 
      //Check for a name that matches the packageName 
      if(packageInfo.packageName.equals(packageName)) { 
       //The package exists 
       return packageInfo; 
      } 
     } 
     //The package was not found 
     //Throw an exception 
     throw new PackageNotFoundException("Package not found"); 
    } 

    //Copy a file from an input directory to an output directory 
    public boolean copyFile(String inputPath, String outputPath) throws IOException { 
     //Construct the input and output paths as File objects with respective read/write privileges 
     //File inputFile = new File("/data/data/org.xbmc.xbmc/files/.xbmc/userdata/guisettings.bak"); 
     //File outputFile = new File("/data/data/org.xbmc.xbmc/files/.xbmc/userdata/guisettings.xml"); 
     //File inputFile = getDir(inputPath, MODE_PRIVATE); 
     //File outputFile = getDir(outputPath, MODE_PRIVATE); 
     File inputFile = new File(inputPath); 
     File outputFile = new File(outputPath); 
     //Check if the input and output files exist 
     if(!inputFile.exists()) { 
      return false; 
     } 
     if(!outputFile.exists()) { 
      //Create the output file 
      new File(outputPath); 
     } 
     //Get the input read state 
     boolean canReadInput = inputFile.canRead(); 
     //Get the output write state 
     boolean canWriteOutput = outputFile.canWrite(); 
     //Check if the input file can be read and if the output file can be written 
     if(canReadInput && canWriteOutput) { 
      //Open respective input and output buffer streams 
      InputStream in = new FileInputStream(inputFile); 
      OutputStream out = new FileOutputStream(outputFile); 
      //Create a byte array 
      byte[] buffer = new byte[1024]; 
      //The current position of the byte buffer 
      int bufferPosition; 
      //While the bufferPosition is reading the file 1024 bytes at a time (-1 = no longer reading) 
      while((bufferPosition = in.read(buffer)) != -1) { 
       //Append the current buffer in memory to the output file 
       //With a pointer offset of 0 and a count of the current bufferPosition 
       out.write(buffer, 0, bufferPosition); 
      } 
      //Close the file streams 
      in.close(); 
      out.close(); 
      return true; 
     } 
     return false; 
    } 

    //The Package Error Class 
    private class PackageNotFoundException extends Exception { 
     //If an error is thrown with a message parameter 
     PackageNotFoundException(String m) { 
      //Pass the message to the super Exception class 
      super(m); 
     } 
    } 
} 

답변

0

내 안드로이드 장치가 내 컴퓨터에 연결하는 데 문제가있는 것으로 나타났습니다. 따라서 CIP 오류가 발생했습니다.

다른 장치로 전환 한 후 "data/data"디렉토리를 통해 액세스하려고 했으므로 입력 파일 자체가 발견되지 않았 음을 발견했습니다. 설치된 앱의 앱 데이터 디렉토리는 외부 저장 경로를 통해서만 액세스 할 수 있습니다. 이것은 장치마다 다르므로 동적으로 검색해야합니다.

이 방법으로 파일에 액세스 한 후 성공적으로 복사 할 수있었습니다.