память ошибок A / libc: фатальный сигнал 11 (SIGSEGV) в 0x00000008 (код = 1), поток 22151 (WebViewCoreThre) - PullRequest
0 голосов
/ 15 февраля 2019

я использую webview в своем приложении и хочу передать файл типа ввода, поэтому, когда я нажимаю на этот файл в webview, я выбираю изображение в sdcard, поэтому я хочу перенести это изображение в base64, используя javascript, чтобы взять этот файл base64 и работать надэто в моем исходном коде Java и установить мой просмотр изображений с этим источником base64, я надеюсь, вы понимаете меня, потому что английский не мой родной язык.

этот файл Java:

static WebView webView;
private ValueCallback<Uri> mUploadMessage;
public ValueCallback<Uri[]> uploadMessage;
public static final int REQUEST_SELECT_FILE = 100;
private final static int FILECHOOSER_RESULTCODE = 1;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.webview_fragment,container,false);

    webView=view.findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setAllowFileAccess(true);
    webView.getSettings().setAllowContentAccess(true);
    webView.getSettings().setBuiltInZoomControls(true);
    //webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    webView.clearCache(false);
    webView.addJavascriptInterface(new DB(),"AndroidFunction");

    webView.loadUrl("file:///android_asset/register/index.html");




    webView.setWebChromeClient(new 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 Browser"), FILECHOOSER_RESULTCODE);
    }


    // For Lollipop 5.0+ Devices
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public boolean onShowFileChooser(WebView mWebView, ValueCallback< Uri[]> filePathCallback, WebChromeClient.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(getActivity().getApplicationContext(), "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 Browser"), 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);
    }
});
    return view;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent)
{
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        if (requestCode == REQUEST_SELECT_FILE)
        {
            if (uploadMessage == null)
                return;
            uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
            uploadMessage = null;
        }
    }
    else if (requestCode == FILECHOOSER_RESULTCODE)
    {
        if (null == mUploadMessage)
            return;
        // Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment
        // Use RESULT_OK only if you're implementing WebView inside an Activity
        Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();
        mUploadMessage.onReceiveValue(result);
        mUploadMessage = null;
    }
    else
        Toast.makeText(getActivity().getApplicationContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show();
}

}

class DB {

public DB(){

}

@JavascriptInterface
public void addToDB(String name, String lastName, String email, String pwd, String yearChild, String gender, Base64 srcImg){

    System.out.println(" le nom est: "+name+" prenom est: "+lastName+" email est: "+email+" password est: "+pwd+" le year child est: "+yearChild+" le gender est: "+gender);

}

}

и это мое изображение типа входного изображения:

    <input type="file" name="name" id="image" placeholder="Photo" required/>

и этот код JavaScript:

<script>

function stor () {

AndroidFunction.addToDB (encodeImageFileAsURL ());

}

function encodeImageFileAsURL () {

var filesSelected = document.getElementById("image").files;
var srcData;

if (filesSelected.length > 0) {
  var fileToLoad = filesSelected[0];

  var fileReader = new FileReader();

  fileReader.onload = function(fileLoadedEvent) {
     srcData = fileLoadedEvent.target.result; // <--- data: base64

  }
  fileReader.readAsDataURL(fileToLoad);
  return srcData;

}

}

любым способом решения этой проблемы или любым альтернативным решением или альтернативой base64, и спасибо за это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...