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).
사용중인 Android 버전은 무엇입니까? 나는 FroYo (2.2) 이전에 안드로이드 브라우저가 파일 업로드를 지원하지 않는다고 믿는다 : http://code.google.com/p/android/issues/detail?id=2519 , 내 N1을 실행 2.2 잘) 작동합니다. –
@Charlie Collins 2.1, 2.2, 2.3에서이 작업을 시도하고 있으며이 작업이 정상적으로 작동하는 것이 좋습니다. 2.1 (Galaxy S)에서도 브라우저에서 정상적으로 작동하지만 사용자 정의 앱의 WebView에서 작동해야합니다. 2.2에서 WebView를 사용하여 앱에서 제대로 작동한다고 하시겠습니까? – m0s
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 –