안드로이드 HTML 파싱하기

JSoup을 사용해서 하면 간단하게 사용할 수 있다.

자바에서도 위에 사용하는 소스를 통해서 이요할 수 있지만, 안드로이드를 통해서 사용할 것이기 때문에 Gradle 을 통해 설치를 해 보겠다.

gradle 의 build.gradle (Module: app) 에 아래와 같은 문구를 추가합니다.

// jsoup HTML parser library @ https://jsoup.org/
compile 'org.jsoup:jsoup:1.10.3'

그리고 Gradle Sync Now를 눌러주는 것을 잊으면 안됩니다. 그래야 적용이 됩니다.

주의할점
메인화면에서 네트워크 연결을 사용하면 에러가 납니다. 메인에서 네트워크 연결을 바로 시도 하면 에러가 납니다. 이 때문에 하루를 날려 버렸습니다.

여러 예제를 보면 다들 AsyncTask를 통해서 이용하고 있습니다. 사용법도 간단하고, 예제도 있지 때문에 저도 같은 방법을 사용할 것입니다.

AsyncTask에 대한 설명이 필요하시면 IT 마이닝 블로그로 이동하기

class MainActivity 아래에

다음과 같은 코드를 추가 합니다.


private class MainPageTask extends AsyncTask<Void,Void,Void> {
    private Elements element;

    @Override
    protected void onPostExecute(Void result) {
        //doInBackground 작업이 끝나고 난뒤의 작업
        mainHello.setText(element.text());
    }

    @Override
    protected Void doInBackground(Void... params) {
        //백그라운드 작업이 진행되는 곳.
        try {
            Document doc = Jsoup.connect("http://example.com").get();
            element = doc.select("#algoList > tbody");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

사이트 example.com 를 파싱하려고 합니다.

doInBackground에서 작업을 하고 onPostExcute에서 결과가 끝나고 난 뒤의 작업을 수행합니다.

doInBackground에서 작업을 처리하려고 하면 오류가 납니다. 다른 메소드에 입력 하시는 것을 잊으면 안됩니다.

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요

<blockquote>

  <p>이글은 2017년 7월에 작성 됨</p>

</blockquote>


<h1 id="마시멜로우-api-23-이상에서-권한-체크와-권한-요청하기">마시멜로우 API 23 이상에서 권한 체크와 권한 요청하기</h1>


<p>Android 6.0(API 레벨 23)부터 사용자는 앱이 설치될 때가 아니라 <strong>앱이 실행되는 중에 앱에 권한을 부여</strong>합니다. 이 접근방식에서는 사용자가 앱을 설치하거나 업데이트할 때 권한을 부여할 필요가 없으므로 앱 설치 과정이 간소화됩니다. 또한 사용자가 앱의 기능을 더 세부적으로 제어할 수 있습니다. 예를 들어, 기기 위치가 아니라 카메라에 대한 액세스 권한을 카메라 앱에 부여하도록 선택할 수 있습니다. 사용자는 앱 설정 화면으로 이동하여 언제든지 권한을 취소할 수 있습니다.</p>


<ul>

<li><p><a href="https://developer.android.com/training/permissions/requesting.html#perm-checkl">안드로이드 개발자 페이지 런타임에 권한체크</a></p></li>

<li><p><a href="https://developer.android.com/training/permissions/requesting.html#perm-request">안드로이드 개발자 페이지 런타임에 권한 요청</a></p></li>

</ul>


<h2 id="androidmanifestxml">AndroidManifest.xml</h2>


<p><code>androidmanifest.xml</code>에 필요로 하는 권한을 입력합니다.</p>


<pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag">&lt;<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.READ_CALENDAR"</span>/&gt;</span></code></pre>


<h2 id="mainactivityjava">MainActivity.java</h2>


<h3 id="권한-체크가-필요한-버전인지-확인">권한 체크가 필요한 버전인지 확인</h3>




<pre class="prettyprint"><code class="language-java hljs "><span class="hljs-keyword">if</span> (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.M){

    <span class="hljs-keyword">return</span>;

}</code></pre>


<p><code>protected void onCreate(Bundle saveInstanceState)</code> 아래에 다음과 같은 코드를 사용해서 권한 설정이 제대로 되어 있는지 확인합니다.0</p>


<pre class="prettyprint"><code class="language-java hljs "><span class="hljs-keyword">int</span> permissionCheck = ContextCompat.checkSelfPermission(<span class="hljs-keyword">this</span>,

        Manifest.permission.READ_CALENDAR);

<span class="hljs-keyword">if</span> (permissionCheck == PackageManager.PERMISSION_GRANTED){

    Toast.makeText(<span class="hljs-keyword">this</span>, <span class="hljs-string">"캘린더 권한이 있음"</span>, Toast.LENGTH_SHORT).show();

}<span class="hljs-keyword">else</span>{

    Toast.makeText(<span class="hljs-keyword">this</span>, <span class="hljs-string">"캘린더 권한이 없음"</span>, Toast.LENGTH_SHORT).show();

    <span class="hljs-keyword">if</span> (ActivityCompat.shouldShowRequestPermissionRationale(<span class="hljs-keyword">this</span>,Manifest.permission.READ_CALENDAR)){

        Toast.makeText(<span class="hljs-keyword">this</span>, <span class="hljs-string">"캘린더 권한설명이 필요함"</span>, Toast.LENGTH_SHORT).show();

ActivityCompat.requestPermissions(

                <span class="hljs-keyword">this</span>,

                <span class="hljs-keyword">new</span> String[] {Manifest.permission.READ_CALENDAR},

                <span class="hljs-number">1</span>);

    }<span class="hljs-keyword">else</span>{

        ActivityCompat.requestPermissions(

                <span class="hljs-keyword">this</span>,

                <span class="hljs-keyword">new</span> String[] {Manifest.permission.READ_CALENDAR},

                <span class="hljs-number">1</span>);

    }

}</code></pre>


<p>이제 앱을 실행하면 권한이 제대로 되었는지 체크 할 수 있습니다.</p>


<p>다음은 권한 체크의 결과 화면에 따른 이벤트를 줄 수 있습니다. 권한이 <code>승인</code>되었으면 어떻게 동작하고, <code>거부</code>하였을 동작하는 기능을 합니다.</p>


<p><code>CTRL</code>+<code>O</code> 키를 눌러서 아래와 같은 화면에서 onRequestPermissionResult 를 찾습니다.</p>


<p><img src="http://i.imgur.com/9MBT72U.png" alt="Imgur" title=""></p>


<pre class="prettyprint"><code class="language-java hljs ">

<span class="hljs-annotation">@Override</span>

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onRequestPermissionsResult</span>(<span class="hljs-keyword">int</span> requestCode, @NonNull String[] permissions, @NonNull <span class="hljs-keyword">int</span>[] grantResults) {

    <span class="hljs-keyword">switch</span> (requestCode){

        <span class="hljs-keyword">case</span> <span class="hljs-number">1</span>: {

            <span class="hljs-keyword">if</span> (grantResults.length &gt; <span class="hljs-number">0</span> &amp;&amp; grantResults[<span class="hljs-number">0</span>] == PackageManager.PERMISSION_GRANTED){

                Toast.makeText(<span class="hljs-keyword">this</span>, <span class="hljs-string">"캘린더 권한을 사용자가 승인함"</span>, Toast.LENGTH_SHORT).show();

            }<span class="hljs-keyword">else</span>{

                Toast.makeText(<span class="hljs-keyword">this</span>, <span class="hljs-string">"캘린더 권한 거부됨"</span>, Toast.LENGTH_SHORT).show();

            }

            <span class="hljs-keyword">return</span>;

        }

    }

}</code></pre>


<p>메소드들을 검색하다 보면 신기한 이벤트들을 찾아 볼 수 있습니다. 정말 할 수 있는게 무궁무진 하다는 것을 알 수 있습니다.</p>

블로그 이미지

부들잎

안녕하세요

댓글을 달아 주세요