2011-02-09 9 views
5

앱의 웹보기에 웹 페이지를 표시해야합니다. 이 페이지는 필드 중 하나가 파일 인 html 양식을 포함합니다. 내가 브라우저에서 페이지를 열고 파일 선택 버튼을 누르면 그래서Android webview, 파일 입력 필드 파일 선택기가 표시되지 않습니다.

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

... 같은 간다, 파일 선택은 팝업 모든 것이 훌륭하지만 내가 누를 때 웹보기에서 파일 버튼을 선택합니다 아무 일도 일어나지 않습니다 :/

어떤 아이디어가이 작품을 만드는 방법?

+0

사용중인 Android 버전은 무엇입니까? 나는 FroYo (2.2) 이전에 안드로이드 브라우저가 파일 업로드를 지원하지 않는다고 믿는다 : http://code.google.com/p/android/issues/detail?id=2519 , 내 N1을 실행 2.2 잘) 작동합니다. –

+0

@Charlie Collins 2.1, 2.2, 2.3에서이 작업을 시도하고 있으며이 작업이 정상적으로 작동하는 것이 좋습니다. 2.1 (Galaxy S)에서도 브라우저에서 정상적으로 작동하지만 사용자 정의 앱의 WebView에서 작동해야합니다. 2.2에서 WebView를 사용하여 앱에서 제대로 작동한다고 하시겠습니까? – m0s

+0

WebView에서 특별히 시도하지 않았습니다. 아니요 (브라우저 앱을 사용하고있었습니다). 안드로이드 브라우저는 WebViews를 사용합니다 : http://android.git.kernel.org/?p=platform/packages/apps/Browser.git;a=blob_plain;f=src/com/android/browser/BrowserActivity.java; hb = HEAD –

답변

6

WebView는 기본적으로 파일 선택기를 열지 않습니다. 그러나이 작업을 수행 할 수 있습니다. WebChromeClient에는 숨겨진 메서드 openFileChooser이 있습니다.이 메서드는 파일 선택기를 팝업 한 다음 결과를 WebView에 반환해야합니다. 전문가에 따르면 안드로이드 SDK의 숨겨진 방법을 사용해서는 안되기 때문에 이것은 좋은 해결책이 아니므로 엔터프라이즈 애플 리케이션에 사용해서는 안됩니다. 그러나 안드로이드의 주식 브라우저는 정확히 이런 식으로합니다. 이 방법을 어떻게 무시할 수 있는지에 대한 자세한 정보는 내 것이이 question입니다. 누군가가 소스를 필요로한다면 나에게 알리는 것이 좋다.

+0

안녕하세요, 정확히 똑같은 .. 어딘가에 예제 코드를 게시 할 수 있습니까 ?? – ghostCoder

+0

@ghostCoder 안녕하세요, http://m0s-programming.blogspot.com/2011/02/file-upload-in-through-webview-on.html 게시했습니다. 더 궁금한 점이 있으시면 여기로 질문하십시오. 그 블로그를 자주 확인하지 마십시오. – m0s

+0

게시물 m0s 주셔서 감사합니다,하지만 그것은 벌집에서 2.2에서 작동하는 것 같습니다. 벌집에서 작동하도록하는 방법에 대한 아이디어가 있습니까? – odiggity

2

webview를 통해 파일을 업로드 할 수 있습니까?

이 기능은 버전 1.3.0 이상에서 사용할 수 있습니다. 이전 버전의 앱에서는 가능하지만 추가 코드를 추가해야 작동합니다. AndroidManifest.xml 파일에 다음 코드를 추가하십시오. 다른 용도-권한 요소 아래에 배치 :

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

복사/프로젝트에이 자바 클래스 MediaUtility.java를 붙여 넣습니다. 그것을 com/robotemplates/webviewapp/utility 디렉토리에 넣으십시오.

조각 패키지의 MainFragment.java를 엽니 다. 개인 부울 mLocal =

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; 
    } 
}); 

마지막으로이 라인 "아래의 예를 들어합니다 (MainFragment 객체의 내부 어딘가에 코드를 다음 추가 : 코드에 따라;"webView.setWebChromeClient (새 WebChromeClient()) "renderView() 메소드를 찾기 및 바꾸기 거짓; ") :

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; 
    } 
} 

필요한 수입 추가하는 것을 잊지 마십시오 "수입 android.webkit.ValueCallback; ","수입 com.robotemplates.webviewapp.utility.MediaUtility를, ","수입 java.io .파일;". 그래도 문제가 지속되면 Proguard 스크립트에 규칙을 추가하십시오 (https://code.google.com/p/android/issues/detail?id=62220#c120).

관련 문제