웹뷰앱 만들기 + 파일 권한 > 그누보드5 팁자료실

그누보드5 팁자료실

웹뷰앱 만들기 + 파일 권한 정보

웹뷰앱 만들기 + 파일 권한

본문

*** 완성본은 곧 스토어에 올라옵니다 ***

모르는건 댓글 남겨주세용

 

기본 설명 : 자바입니다. / 프로젝트 생성할 때 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

댓글 8개

어플출력 까지 잘했는데 쿠팡이나 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;
}
감사합니다 해당글과 다른 인터넷들을 참고해서 앱뷰앱 제작해보았습니다.
정상작동되며 앞으로 잘 사용할 수 있을듯한데 한가지 문제가 있습니다.

임베드된 동영상이 영상재상은되나 전체화면을 눌러도 먹통입니다.
해당 정보들을 인터넷에서 찾아보았으나 방법은있는듯한데 너무 어렵게 설명이 되어있어서 초보자로서 수정을 못하고 있습니다.

유튜브, 중국 유쿠등 동영상이 웹뷰앱에서 전체화면 재생되게하려면 어떻게 해야할까요?

https://github.com/cprcrack/VideoEnabledWebView

글데로하면 될다고해서 참고하려고해봐도 수정할 방법을 모르겠습니다.
혹시라도 방법을 알고 계신다면 부탁드릴께요~
전체 32 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT