웹뷰앱 만들기 + 파일 권한 정보
웹뷰앱 만들기 + 파일 권한본문
*** 완성본은 곧 스토어에 올라옵니다 ***
모르는건 댓글 남겨주세용
기본 설명 : 자바입니다. / 프로젝트 생성할 때 Use legacy android.support libraries 선택해주셔야해요.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" tools:layout_editor_absoluteX="8dp" tools:layout_editor_absoluteY="8dp" /> </android.support.constraint.ConstraintLayout>
-
MainActivity.Java
패키지 명 밑에다가 해주시고, 빨간색으로 에러뜨는 부분은 Alt Enter 누르셔서 import 해주세요.
사이트 주소 부분에는 본인 사이트 주소 적으시면 됩니다. http or https 까지요
public class MainActivity extends AppCompatActivity { public static final String TAG = "사이트 이름"; public static final int IMAGE_SELECTOR_REQ = 999; public static final int KAKAO_SHARE_REQ = 998; public static final String SERVER_IP = "사이트주소"; public static final String SERVER_HOST = "사이트주소"; private WebView myWebView; private ValueCallback mFilePathCallback; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // HashGetter.getHashKey(getApplicationContext()); myWebView = (WebView) findViewById(R.id.webview); myWebView.setWebChromeClient(new MyWebChromeClient()); setGPULayerType(myWebView); myWebView.setWebViewClient(new WebViewClient()); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setPluginState(WebSettings.PluginState.ON); myWebView.loadUrl(SERVER_IP); } private void setGPULayerType(WebView webView) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); } else { webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK){ switch (requestCode) { case IMAGE_SELECTOR_REQ: if (data.getClipData() != null) { int count = data.getClipData().getItemCount(); Uri[] uris = new Uri[count]; for (int i = 0; i < count; i++) uris[i] = data.getClipData().getItemAt(i).getUri(); mFilePathCallback.onReceiveValue(uris); } else if (data.getData() != null) { mFilePathCallback.onReceiveValue(new Uri[]{data.getData()}); } break; case KAKAO_SHARE_REQ: Log.d(TAG, "onActivityResult: Kakao Share"); myWebView.getOriginalUrl(); break; } } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) { myWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); } private class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show(); result.confirm(); return true; } @Override public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { mFilePathCallback = filePathCallback; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(Intent.createChooser(intent,"Select Picture"), IMAGE_SELECTOR_REQ); return true; } } private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (Uri.parse(url).getHost().equals("사이트주소")) { // This is my website, so do not override; let my WebView load the page return false; } // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } } }
AndroidManifest.xml
다른 코드 삭제하지 마시고 package 밑에다가 이 코드를 넣어주세요.
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
만약 사이트 주소가 http라면
android:supportsRtl="true" 밑에다가
android:usesCleartextTraffic="true" 를 넣어주세요.
이 코드 넣어주세요.
끝입니다.
추천
7
7
댓글 8개
감사합니다
넵! 혹시나 스토어에 등록하실거라면 apk말고 bundle로 추출하셔야 좋아요!
고맙습니다.
아는 것이 부족해서 에러 나면 어쩌나 걱정했는데
에러 하나 없이 한번에 실행되었습니다.
아는 것이 부족해서 에러 나면 어쩌나 걱정했는데
에러 하나 없이 한번에 실행되었습니다.
에러 하나도 없는 코드랍니당 ㅎㅎ
잘 몰라서 그러는데 툴은 어떤걸 쓰나요?
안드로이드 스튜디오라고 안드로이드 제작 프로그램이 있습니다.
https://developer.android.com/studio
https://developer.android.com/studio
어플출력 까지 잘했는데 쿠팡이나 11번가등등 제홈피에 사이트를 걸어서 터치하니 net::ERR_UNKNOWN_URL_SCHEME 이런 에러가 뜹니다.
그래서 구글링 해보니 "해당 코드를 WebViewClient에 추가해주면 해결된다. (자바)"
이렇게 나오는데 WebViewClient에 추가하는 방법을 모르겠습니다.
도와주세요.
해당소스는 아래 입니다.
//자바
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && url.startsWith("intent://")) {
try {
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
if (existPackage != null) {
startActivity(intent);
} else {
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.setData(Uri.parse("market://details?id=" + intent.getPackage()));
startActivity(marketIntent);
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else if (url != null && url.startsWith("market://")) {
try {
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
if (intent != null) {
startActivity(intent);
}
return true;
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
view.loadUrl(url);
return false;
}
그래서 구글링 해보니 "해당 코드를 WebViewClient에 추가해주면 해결된다. (자바)"
이렇게 나오는데 WebViewClient에 추가하는 방법을 모르겠습니다.
도와주세요.
해당소스는 아래 입니다.
//자바
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && url.startsWith("intent://")) {
try {
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
if (existPackage != null) {
startActivity(intent);
} else {
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.setData(Uri.parse("market://details?id=" + intent.getPackage()));
startActivity(marketIntent);
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else if (url != null && url.startsWith("market://")) {
try {
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
if (intent != null) {
startActivity(intent);
}
return true;
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
view.loadUrl(url);
return false;
}
감사합니다 해당글과 다른 인터넷들을 참고해서 앱뷰앱 제작해보았습니다.
정상작동되며 앞으로 잘 사용할 수 있을듯한데 한가지 문제가 있습니다.
임베드된 동영상이 영상재상은되나 전체화면을 눌러도 먹통입니다.
해당 정보들을 인터넷에서 찾아보았으나 방법은있는듯한데 너무 어렵게 설명이 되어있어서 초보자로서 수정을 못하고 있습니다.
유튜브, 중국 유쿠등 동영상이 웹뷰앱에서 전체화면 재생되게하려면 어떻게 해야할까요?
https://github.com/cprcrack/VideoEnabledWebView
글데로하면 될다고해서 참고하려고해봐도 수정할 방법을 모르겠습니다.
혹시라도 방법을 알고 계신다면 부탁드릴께요~
정상작동되며 앞으로 잘 사용할 수 있을듯한데 한가지 문제가 있습니다.
임베드된 동영상이 영상재상은되나 전체화면을 눌러도 먹통입니다.
해당 정보들을 인터넷에서 찾아보았으나 방법은있는듯한데 너무 어렵게 설명이 되어있어서 초보자로서 수정을 못하고 있습니다.
유튜브, 중국 유쿠등 동영상이 웹뷰앱에서 전체화면 재생되게하려면 어떻게 해야할까요?
https://github.com/cprcrack/VideoEnabledWebView
글데로하면 될다고해서 참고하려고해봐도 수정할 방법을 모르겠습니다.
혹시라도 방법을 알고 계신다면 부탁드릴께요~