2017-08-05 72 views
0

我想上傳一個圖像到php,爲此我需要發送一個文件到服務器。所以我試圖從數據參數創建一個文件。從Uri創建文件

但我得到這個錯誤Cannot resolve constructor File

這裏是我的代碼:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK) { 
      // Get the url from data 
      Uri selectedImageUri = data.getData(); 
      if (null != selectedImageUri) { 
       // File 
       File imageFilePath = new File(selectedImageUri); 
+0

你能告訴我一個data.getData()值? –

+0

如果條件 – redAllocator

+0

在哪一行你會得到異常? –

回答

-2

你可以試試這個;

try { 
       Uri uri = data.getData(); 
       String selectedFilePath = FilePath.getPath(getActivity(), uri); 
       final File file = new File(selectedFilePath); 

       new UploadFileToServer().execute(file); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

and define FilePath class like this;

import android.content.ContentUris; 
import android.content.Context; 
import android.database.Cursor; 
    import android.net.Uri; 
import android.os.Build; 
import android.os.Environment; 
import android.provider.DocumentsContract; 
import android.provider.MediaStore; 

public class FilePath { 

/** 
* Method for return file path of Gallery image/ Document/Video/Audio 
* 
* @param context 
* @param uri 
* @return path of the selected image file from gallery 
*/ 
public static String getPath(final Context context, final Uri uri) { 

    // check here to KITKAT or new version 
    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]; 
      } 
     } 
     // 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; 
} 

/** 
* Get the value of the data column for this Uri. This is useful for 
* MediaStore Uris, and other file-based ContentProviders. 
* 
* @param context 
*   The context. 
* @param uri 
*   The Uri to query. 
* @param selection 
*   (Optional) Filter used in the query. 
* @param selectionArgs 
*   (Optional) Selection arguments used in the query. 
* @return The value of the _data column, which is typically a file path. 
*/ 
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; 
} 

/** 
* @param uri 
*   The Uri to check. 
* @return Whether the Uri authority is ExternalStorageProvider. 
*/ 
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()); 
} 
} 
+1

這不是你應該如何從任何'Uri'獲取數據 - 使用ContentResolver API代替 – pskink

6

適當的方式是getContentResolver().openInputStream(uri_of_your_file);並使用FileOutputStream到你想要的路徑,然後使用該文件。

由於從Commonsware answer

您可以使用ContentResolver的和openInputStream()來獲得由URI所代表的內容的 的InputStream。您可以在您控制的某個文件上創建一個 FileOutputStream。而且,您可以使用Java I/O將InputStream複製到OutputStream,從而在您控制的文件中創建自己的 副本。

做這件事的示例代碼,

InputStream in = getContentResolver().openInputStream("your_uri_here"); 
OutputStream out = new FileOutputStream(new File("your_file_here")); 
     byte[] buf = new byte[1024]; 
     int len; 
     while((len=in.read(buf))>0){ 
      out.write(buf,0,len); 
     } 
     out.close(); 
     in.close(); 
你必須檢查requestCode的if語句或切換
+0

哪個文件進入「your_file_here」? ??因爲我正在嘗試創建文件並且沒有任何文件。 –

+0

使用路徑創建文件。 –