2011-02-09 48 views
5

Tôi phải hiển thị trang web trong chế độ xem web trong ứng dụng. Trang chứa một dạng html trong đó một trong các trường là tệp. Vì vậy, nó đi một cái gì đó giống như ...Trình xem web trên Android, trình xử lý tệp đầu vào của tệp không hiển thị

<input type="file" name="file"> 

Nếu tôi mở trang trong trình duyệt và nhấn nút Chọn File, chọn tập tin bật lên và mọi thứ đều tốt, nhưng khi tôi nhấn nút Chọn File trong webview không có gì xảy ra:/

Bất kỳ ý tưởng nào về cách thực hiện công việc này?

+0

Bạn đang làm việc với phiên bản Android nào? Tôi tin rằng trước khi FroYo (2.2) trình duyệt Android tích hợp không hỗ trợ tải lên tệp: http://code.google.com/p/android/issues/detail?id=2519 (tính đến 2.2, nó sẽ hoạt động mặc dù , hoạt động tốt trên N1 của tôi chạy 2.2). –

+0

@Charlie Collins Tôi đang cố gắng này trên 2.1, 2.2, 2.3 và nó sẽ là ok nếu nó làm việc trên bất kỳ trong số này. Nó hoạt động tốt trong trình duyệt ngay cả trên 2.1 (Galaxy S), nhưng tôi cần điều này để làm việc trong một WebView trong một ứng dụng tùy chỉnh. Bạn đang nói nó hoạt động tốt trong ứng dụng của bạn với một WebView trên 2,2? – m0s

+0

Tôi đã không cố gắng cụ thể nó trong một WebView, không có (Tôi chỉ sử dụng các ứng dụng trình duyệt). Trình duyệt Android sử dụng WebViews mặc dù: http://android.git.kernel.org/?p=platform/packages/apps/Browser.git;a=blob_plain;f=src/com/android/browser/BrowserActivity.java; hb = HEAD –

Trả lời

6

WebView theo mặc định không mở trình chọn tệp. Tuy nhiên có thể thực hiện công việc này. WebChromeClient có phương thức ẩn openFileChooser, cần phải được ghi đè để bật trình chọn tệp và sau đó trả về kết quả cho WebView. Theo một người rất kinh nghiệm không bao giờ nên sử dụng các phương pháp ẩn của Android SDK vì vậy đây không phải là một giải pháp tốt, và có lẽ không nên được sử dụng trong các ứng dụng doanh nghiệp. Tuy nhiên, trình duyệt chứng khoán của Android thực hiện chính xác theo cách này. Ít thông tin hơn làm thế nào tôi overrode phương pháp này là trong của tôi question này. Nếu bất cứ ai cần nguồn cho tôi biết Ill đăng nó ở đâu đó.

+0

Xin chào, tôi cần làm chính xác cùng một điều .. u có thể đăng mã ví dụ một nơi nào đó ?? – ghostCoder

+0

@ghostCoder Xin chào, tôi đã đăng nó http://m0s-programming.blogspot.com/2011/02/file-upload-in-through-webview-on.html Nếu bạn có thêm câu hỏi, hãy hỏi tại đây tôi don ' t kiểm tra blog đó thường xuyên. – m0s

+0

Cảm ơn bạn đã đăng bài m0, có vẻ như nó hoạt động ở 2,2 nhưng không phải là tổ ong. Bất kỳ ý tưởng làm thế nào để có được nó để làm việc trong tổ ong? – odiggity

2

Có thể tải tệp lên qua chế độ xem web không?

Tính năng này có sẵn trong phiên bản 1.3.0 và mới hơn. Đối với các phiên bản cũ của ứng dụng, có thể, nhưng bạn cần phải thêm một số mã phụ để làm cho nó hoạt động. Thêm mã sau vào tệp AndroidManifest.xml của bạn. Đặt nó bên dưới các yếu tố khác cho phép sử dụng:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

Sao chép/dán lớp java MediaUtility.java này vào dự án. Đặt nó vào thư mục com/robotemplates/webviewapp/utility.

Mở gói MainFragment.java trong gói phân đoạn. Tìm phương pháp renderView() và thay thế “webView.setWebChromeClient (WebChromeClient mới());” bằng cách làm theo mã:

webView.setWebChromeClient(new WebChromeClient() 
{ 
    public void openFileChooser(ValueCallback<Uri> filePathCallback) 
    { 
     mFilePathCallback4 = filePathCallback; 
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.addCategory(Intent.CATEGORY_OPENABLE); 
     intent.setType("*/*"); 
     startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); 
    } 

    public void openFileChooser(ValueCallback filePathCallback, String acceptType) 
    { 
     mFilePathCallback4 = filePathCallback; 
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.addCategory(Intent.CATEGORY_OPENABLE); 
     intent.setType("*/*"); 
     startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); 
    } 

    public void openFileChooser(ValueCallback<Uri> filePathCallback, String acceptType, String capture) 
    { 
     mFilePathCallback4 = filePathCallback; 
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.addCategory(Intent.CATEGORY_OPENABLE); 
     intent.setType("*/*"); 
     startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); 
    } 

    @Override 
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) 
    { 
     mFilePathCallback5 = filePathCallback; 
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.addCategory(Intent.CATEGORY_OPENABLE); 
     intent.setType("*/*"); 
     startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); 
     return true; 
    } 
}); 

Cuối cùng thêm mã sau ở đâu đó bên trong đối tượng MainFragment (ví dụ bên dưới dòng này “boolean tin mLocal = false;”):

private static final int REQUEST_FILE_PICKER = 1; 
private ValueCallback<Uri> mFilePathCallback4; 
private ValueCallback<Uri[]> mFilePathCallback5; 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) 
{ 
    if(requestCode==REQUEST_FILE_PICKER) 
    { 
     if(mFilePathCallback4!=null) 
     { 
      Uri result = intent==null || resultCode!=Activity.RESULT_OK ? null : intent.getData(); 
      if(result!=null) 
      { 
       String path = MediaUtility.getPath(getActivity(), result); 
       Uri uri = Uri.fromFile(new File(path)); 
       mFilePathCallback4.onReceiveValue(uri); 
      } 
      else 
      { 
       mFilePathCallback4.onReceiveValue(null); 
      } 
     } 
     if(mFilePathCallback5!=null) 
     { 
      Uri result = intent==null || resultCode!=Activity.RESULT_OK ? null : intent.getData(); 
      if(result!=null) 
      { 
       String path = MediaUtility.getPath(getActivity(), result); 
       Uri uri = Uri.fromFile(new File(path)); 
       mFilePathCallback5.onReceiveValue(new Uri[]{ uri }); 
      } 
      else 
      { 
       mFilePathCallback5.onReceiveValue(null); 
      } 
     } 

     mFilePathCallback4 = null; 
     mFilePathCallback5 = null; 
    } 
} 

Đừng quên để thêm hàng nhập khẩu cần thiết:‘nhập khẩu android.webkit.ValueCallback;’,‘nhập khẩu com.robotemplates.webviewapp.utility.MediaUtility;’,“nhập khẩu java.io .Tập tin;". Nếu bạn vẫn gặp sự cố, hãy thử thêm quy tắc trong tập lệnh Proguard: https://code.google.com/p/android/issues/detail?id=62220#c120.

Các vấn đề liên quan