2017-07-09 3 views
0

過去数日間、私は間違っていることを理解しようとしてきました。ユーザーがファイル(非イメージ)をアップロードし、URIオブジェクトをファイルに変換してバイト配列に変換しようとすると、次のエラーが発生します。ストレージからファイルをインポートするときにFileNotFoundExceptionが発生する(Androidスタジオ)

java.io.FileNotFoundException:/ document/2301 (そのようなファイルやディレクトリはありません)

明らかに私には何らかのパスが表示されていたので、何かをアップロードしていました。

MAINアクティビティ -

import android.Manifest; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.graphics.Bitmap; 
import android.media.MediaFormat; 
import android.net.Uri; 
import android.provider.MediaStore; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ImageView; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 

      requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); 

     } else { 

      getFile(); 

     } 
    } 

    public void getFile() { 

     Intent intent = new Intent(); 
     intent.setType("application/pdf"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 

     startActivityForResult(intent, 1); 

    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     if (requestCode == 1) { 

      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       getFile(); 

      } 


     } 

    } 


    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == 1 && resultCode == RESULT_OK && data != null) { 

      Uri selectedFile = data.getData(); 

      Log.i("Path", selectedFile.getPath()); 

      File file = new File(selectedFile.getPath()); 

      byte[] b = new byte[(int) file.length()]; 
      try { 
       FileInputStream fileInputStream = new FileInputStream(file); 
       fileInputStream.read(b); 
       for (int i = 0; i < b.length; i++) { 
        System.out.print((char)b[i]); 
       } 
      } catch (FileNotFoundException e) { 
       System.out.println("File Not Found."); 
       e.printStackTrace(); 
      } 
      catch (IOException e1) { 
       System.out.println("Error Reading The File."); 
       e1.printStackTrace(); 
      } 

     } 

    } 
} 

ヘルプの任意の並べ替えが高く評価されています。ここに私のコードです!

+0

の可能重複https://stackoverflow.com/questions/16791439/android-how-to-get-uri-from-raw-file?rq=1 –

+0

@IvanPronin私はこれがどのように重複しているのか見当たりません。 – TheFiveHundredYears

+0

あなたのinputStreamとして 'getResources()。openRawResource(ResourceID)'を使用してください。受け入れられた答え –

答えて

0

ファイルが内部ストレージに存在しません。問題を解決するには、以下のコードを使用してください。

public static String getPath(Context context, Uri uri) { 
    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 

    // DocumentProvider 
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 
     // ExternalStorageProvider 
     if (isExternalStorageDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 

      if ("primary".equalsIgnoreCase(type)) { 
       return Environment.getExternalStorageDirectory() + "/" + split[1]; 
      } 
      // TODO handle non-primary volumes 
     } 
     // DownloadsProvider 
     else if (isDownloadsDocument(uri)) { 
      final String id = DocumentsContract.getDocumentId(uri); 
      final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); 
      return getDataColumn(context, contentUri, null, null); 
     } 
     // MediaProvider 
     else 
     if (isMediaDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 
      Uri contentUri = null; 
      if ("image".equals(type)) { 
       contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
      } else if ("video".equals(type)) { 
       contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
      } else if ("audio".equals(type)) { 
       contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
      } 
      final String selection = "_id=?"; 
      final String[] selectionArgs = new String[] {split[1]}; 
      return getDataColumn(context, contentUri, selection, selectionArgs); 
     } 
    } 
    // MediaStore (and general) 
    else if ("content".equalsIgnoreCase(uri.getScheme())) { 
     // Return the remote address 
     if (isGooglePhotosUri(uri)) 
      return uri.getLastPathSegment(); 
     return getDataColumn(context, uri, null, null); 
    } 
    // File 
    else if ("file".equalsIgnoreCase(uri.getScheme())) { 
     return uri.getPath(); 
    } 
    return null; 
} 

public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { 
    Cursor cursor = null; 
    final String column = "_data"; 
    final String[] projection = { column }; 
    try { 
     cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); 
     if (cursor != null && cursor.moveToFirst()) { 
      final int index = cursor.getColumnIndexOrThrow(column); 
      return cursor.getString(index); 
     } 
    } finally { 
     if (cursor != null) 
      cursor.close(); 
    } 
    return null; 
} 

public static boolean isExternalStorageDocument(Uri uri) { 
    return "com.android.externalstorage.documents".equals(uri.getAuthority()); 
} 

/** 
* @param uri The Uri to check. 
* @return Whether the Uri authority is DownloadsProvider. 
*/ 
public static boolean isDownloadsDocument(Uri uri) { 
    return "com.android.providers.downloads.documents".equals(uri.getAuthority()); 
} 

/** 
* @param uri The Uri to check. 
* @return Whether the Uri authority is MediaProvider. 
*/ 
public static boolean isMediaDocument(Uri uri) { 
    return "com.android.providers.media.documents".equals(uri.getAuthority()); 
} 

/** 
* @param uri The Uri to check. 
* @return Whether the Uri authority is Google Photos. 
*/ 
public static boolean isGooglePhotosUri(Uri uri) { 
    return "com.google.android.apps.photos.content".equals(uri.getAuthority()); 
} 

任意の形式でファイルを参照するには、次のコードを使用します。

public void browseClick() { 

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("*/*"); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    //intent.putExtra("browseCoa", itemToBrowse); 
    //Intent chooser = Intent.createChooser(intent, "Select a File to Upload"); 
    try { 
     //startActivityForResult(chooser, FILE_SELECT_CODE); 
     startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"),FILE_SELECT_CODE); 
    } catch (Exception ex) { 
     System.out.println("browseClick :"+ex);//android.content.ActivityNotFoundException ex 
    } 
} 

次に、そのファイルパスをonActivityResultで次のように取得します。

これを実行すると、適切な操作でファイルを保存したアプリケーションの外部ストレージからこのファイルを開くことができます。

提供:https://stackoverflow.com/a/36129285/6050536

+0

'data.getData()'は 'data.getData()。toString()'に置き換えられました。 selectedFile.getPath()をチェックするたびに、 '/ document /#somenumber#'が表示されます。これはどういう意味ですか?私は自分の電話機に「文書」フォルダを持っていません。 – TheFiveHundredYears

+0

ありがとう!ただし、FilenameUtilsは依然として有効な参照ですか?それはもはや存在しないようです。 – TheFiveHundredYears

+0

はい、それを使用してファイル名を取得することができます: uri.toString()。substring(uri.toString()。lastIndexOf( "/")+ 1); – Ali

0
private String fileToBase64Conversion(Uri file) { 
     InputStream inputStream = null;//You can get an inputStream using any IO API 
     ByteArrayOutputStream output = new ByteArrayOutputStream(); 
     try { 
      inputStream = context.getContentResolver().openInputStream(file); 
      byte[] buffer = new byte[8192]; 
      int bytesRead; 
      Base64OutputStream outputBase64 = new Base64OutputStream(output, Base64.DEFAULT); 
      try { 
       while ((bytesRead = inputStream.read(buffer)) != -1) { 
        outputBase64.write(buffer, 0, bytesRead); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      outputBase64.close(); 
     } catch (Exception ex) { 

     } 

     return outputBase64.toString(); 
    } 
関連する問題