>source

WebView를 통해 웹 사이트를로드 할 수있는 Android 애플리케이션을 작성해야합니다. 웹 사이트에 입력 값이 있습니다 (Type = FILE)

<form action="...">
    <input type="file" name="myFile" value="" id="..."><
    <input type="submit" value="submit"><
</form>

로드가 완료되면 애플리케이션은 특정 이미지를 사용하고 저장 경로를 통해 이미지를 업로드해야합니다.

String Path = "/storage/emulated/0/myimage.jpg"

이미 FileChooser-Dialog를 열려고했지만 작동하지만 파일 선택기가없는 솔루션이 필요합니다. "경로"-변수의 경로를 사용해야합니다. 나는 이것이 큰 보안 누출이 될 것이라는 것을 알고 있지만 이것에 대한 해결책이 있습니까? JavaScript를 통해 다이 입력 값을 변경할 수 있습니까? 도서관이 있을까요?

PS : 불법적 인 일이 아닙니다. 회사 앱에서 프로필 이미지를 생성하고 있으며 기존의 변경 불가능한 파일 형식의 입력을 통해 업로드해야합니다.

미리 감사합니다.


  • 답변 # 1

    이것을 시도해보십시오 :

    1) 파일의 URI를 가져옵니다.

    <시간>

    2) 트리거 file chooser

    <시간>

    3) onShowFileChooser 재정의   WebChromeClient 내부   이렇게 :

    ValueCallback<Uri[]> mFilePathCallback;
    @Override
     public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
                  if (mFilePathCallback != null) {
                        mFilePathCallback.onReceiveValue(null);
                    }
                    mFilePathCallback = filePathCallback;
                    mFilePathCallback.onReceiveValue(myURI);
                    mFilePathCallback = null;
                    return true;
    }
    
    

    여기 myURI   URI 입니다  파일을 확인하십시오.

  • 답변 # 2

    내 답변을 확인하십시오. 기본적으로해야 할 일은 WebChromeClient 를 재정의하는 것입니다.  그리고 그 방법 openFileChooser .

    class MyWebChromeClient extends WebChromeClient {
        // For 3.0+ Devices (Start)
        // onActivityResult attached before constructor
        protected void openFileChooser(ValueCallback uploadMsg, String acceptType) {
            mUploadMessage = uploadMsg;
            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType("image/*");
            startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
        }
    
        // For Lollipop 5.0+ Devices
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            if (uploadMessage != null) {
                uploadMessage.onReceiveValue(null);
                uploadMessage = null;
            }
            uploadMessage = filePathCallback;
            Intent intent = fileChooserParams.createIntent();
            try {
                startActivityForResult(intent, REQUEST_SELECT_FILE);
            } catch (ActivityNotFoundException e) {
                uploadMessage = null;
                Toast.makeText(WebLink.this, "Cannot Open File Chooser", Toast.LENGTH_LONG).show();
                return false;
            }
            return true;
        }
        //For Android 4.1 only
        protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
            mUploadMessage = uploadMsg;
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            intent.setType("image/*");
            startActivityForResult(Intent.createChooser(intent, "File Chooser"), FILECHOOSER_RESULTCODE);
        }
        protected void openFileChooser(ValueCallback<Uri> uploadMsg) {
            mUploadMessage = uploadMsg;
            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType("image/*");
            startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
        }
    }
    
    

관련 자료

  • 이전 google apps script - 한 장에 두 가지 유형의 타임 스탬프를 배치하는 방법은 무엇입니까?
  • 다음 javascript - 다른 드롭 다운에서 국제 전화 입력 변경 드롭 다운 다이얼 코드