하이브리드앱을 개발하다보면 해당 코드 부분이 웹에서는 잘작동하는데 웹뷰에서는 작동이 안되는 사항이 있습니다.
파일추가를 눌렀는데 파일을 선택할수 있는창이 안나오는 그런경우를 볼수있는데 안드로이드에서 이 부분에 작업을 추가적으로 해야 정상 작동이 됩니다.
- 웹소스
<input type="file" name="file" />
<button onclick="fileAttach()">파일추가</button>
- 안드로이드 소스
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.travelwebview">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/Theme.AppCompat.NoActionBar">
<activity android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
저번 웹뷰때 소스랑 비슷한대 추가적으로 저장소 권한을 추가 하였습니다.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
MainActivity.java
package com.example.travelwebview;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private WebView webView;
private String url = "http://www.naver.com";
ValueCallback mFilePathCallback = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClientClass());
webView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
mFilePathCallback = filePathCallback;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
// 파일 n개 선택 가능하도록 처리
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 0);
return true;
}
});
}
// 안드로이드 웹뷰에서 파일 첨부하기
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("resultCode:: ", String.valueOf(resultCode));
if (requestCode == 0 && resultCode == Activity.RESULT_OK) {
// 파일 n개 선택한 경우
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && data != null && data.getClipData() != null && data.getClipData().getItemCount() > 0) {
int count = data.getClipData().getItemCount();
Uri[] uriArr = new Uri[count];
for (int i = 0; i < count; i++) {
uriArr[i] = data.getClipData().getItemAt(i).getUri();
}
mFilePathCallback.onReceiveValue(uriArr);
} else if (data != null && data.getData() != null) {
// 파일 1개 선택한 경우
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mFilePathCallback.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
} else {
mFilePathCallback.onReceiveValue(new Uri[]{data.getData()});
}
}
mFilePathCallback = null;
} else {
mFilePathCallback.onReceiveValue(null);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
private class WebViewClientClass extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
}
웹뷰에서 파일을 첨부할 수 있게 onShowFileChooser를 추가 하였습니다.
onActivityResult에서 카메라 이미지를 여러개 선택할수 있기 때문에 분기처리 하였습니다.
뒤로가기 클릭시 webview도 뒤로 갈수있게 onKeyDown 기능을 추가하였습니다.
'안드로이드' 카테고리의 다른 글
[Android] 안드로이드 앱아이콘 만들기 (0) | 2021.10.19 |
---|---|
[안드로이드] 상단 타이틀바 없애기 (0) | 2021.10.06 |
[안드로이드] 웹뷰 설정 (0) | 2021.10.06 |
[Android] 버튼 클릭시 이미지 바꾸기 (0) | 2021.06.03 |
[AndroidStudio] 버튼 클릭 이벤트 (Toast, Intent.ACTION_VIEW) (0) | 2021.06.02 |