이사 했습니다. 꾸벅


apk download to sdcard from webview android

이번 글에서는, 다음과 같은 과정을 기술한다.

1. apk 파일을 다운 받을 수 있는 WAS 구축(HTML의 a 태그를 이용한다.)
2. 안드로이드 웹뷰를 통한 웹페이지 접근
3.  웹뷰 클라이언트를 오버라이딩하여 apk 파일을 sd 카드 내에 다운 받기
4.  다운 받은 apk를 안드로이드 패키지 매니저를 통해 install 하기

1. apk 파일을 다운 받을 WAS 구축
  WAS는 톰캣을 이용했다. 톰캣의 설치는 간단하므로 이 글에서는 제외한다. 참고로 난 우분투에서 만들었다. war을 톰캣 서버에 deploy할 때 다음과 같은 html을 추가했다.

- war 파일 내 경로 : test/
- 경로 내 포함된 파일 : test.html, HelloWorld.apk

1.1 test.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>
<a href="http:// ip 주소 :8180/rfidtest/test/HelloWorld.apk">click here to download apk file. </a>
</h2>
</body>
</html>

위의 소스를 보면 알겠지만, <a> 태그를 통해 apk 파일을 다운할 수 있도록 했다.

1.2. HelloWorld.apk : 다운로드될 apk 파일. TextView를 통해 HelloWorld 텍스트를 뿌리는 기본 app이다.

2. 안드로이드 웹뷰를 통한 웹페이지 접근
webView.loadUrl("http:// ip 주소/rfidtest/test/test.html"); // 웹뷰를 통해 웹페이지를 접근한다.
webView.getSettings().setJavaScriptEnabled(true);  // 자바 스크립트를 enable한다. (이번 글 내용과는 상관 없다.)
webView.requestFocus(); // 웹뷰가 포커스를 가진다.(클릭 및 터치를 app 내에서 처리해야하므로 필요하다.
webView.setWebViewClient(new Callback()); // 웹뷰 클라이언트 등록( 3에서 자세히 설명) 

3.  웹뷰 클라이언트를 오버라이딩하여 apk 파일을 sd 카드 내에 다운 받기
4.  다운 받은 apk를 안드로이드 패키지 매니저를 통해 install 하기
웹뷰를 통해 보여지는 페이지에서, <a> 태그로 이루어진 부분을 클릭(혹은 터치)하게 될 때 그 처리를 담당하는 곳이 shouldOverrideUrlLoading() 메서드이다. 코드는 다음과 같다.

private class Callback extends WebViewClient {
 private void downloadFile(String fileUrl){
          URL myFileUrl =null;          
          try {
               myFileUrl= new URL(fileUrl);
          } catch (MalformedURLException e) {
               e.printStackTrace();
          }
          try {
               HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
               conn.setDoInput(true);
               conn.connect();
               InputStream is = conn.getInputStream();

// 다운 받는 파일의 경로는 sdcard/ 아래 이다. 단, sdcard에 접근하려면 uses-permission에 android.permission.WRITE_EXTERNAL_STORAGE을 추가해야한다.
               String mPath = "sdcard/HelloWorld.apk";
               FileOutputStream fos;
               File f = new File(mPath);
               if ( f.createNewFile() ) {
              fos = new FileOutputStream(mPath);   
              int read;
              while ( (read =  is.read()) != -1) {
              fos.write(read);
              }
              fos.close();
               }
          } catch (IOException e) {
               e.printStackTrace();
          }
          Toast.makeText(getApplicationContext(), "download complete", 0).show();
          
// 안드로이드 패키지 매니저를 통해 다운 받은 apk 파일을 처리하도록 한다.
          File apkFile = new File(Environment.getExternalStorageDirectory()+ "/HelloWorld.apk");
          Intent intent = new Intent(Intent.ACTION_VIEW);
          intent.setDataAndType( Uri.fromFile(apkFile), "application/vnd.android.package-archive");
          startActivity(intent);
     }
 
@Override
public boolean shouldOverrideUrlLoading(WebView view, final String urlStr) {
// <a> 태그의 href 속성 값이 urlStr로 전달되므로, 파일을 다운로드 하면 된다.
downloadFile(urlStr);
return super.shouldOverrideUrlLoading(view, urlStr);
}
}

문의 사항이 있으시면 연락 주세요. 꾸벅. sdop25@gmail.com

Tomcat – java.security.AccessControlException: access denied (logging.properties read) servlet

톰캣에서 로그 정보를 볼 때 유용한 정보이다. 링크는 여기.

우분투 톰캣 설치 및 설정 servlet

prerequsite : java 1.5가 설치되어 있다고 가정

1. 톰캣
$ sudo apt-get install tomcat5.5 tomcat5.5-webapps tomcat5.5-admin

2. Tomcat setting configuration file
우분투 기본 자바 설정을 바꾼다.
$ sudo update-alternatives --config java
(몇 가지 목록이 나오는데, 자신의 자바가 설치된 경로를 지정해준다.)
자바1.5의 경우 경로는 다음과 같다. 
/usr/lib/jvm/java-1.5.0-sun/

tomcat 설정파일에서 JAVA_HOME 변수의 위치를 설정한다.
$ sudo vi /etc/default/tomcat5.5
JAVA_HOME= /usr/lib/jvm/java-1.5.0-sun/  
위 처럼 주석을 풀고 세팅한다.

3. 톰캣 서버 시작
sudo /etc/init.d/tomcat5.5 start

홈페이지로 다음의 경로에 접속하면 홈페이지가 열린다.
http://localhost:8180/


android TextView android:ellipsize="marquee" android

텍스트의 marquee 효과를 원할 경우, xml에 다음과 같이 기술하면 된다. 

android:ellipsize="marquee"
android:singleLine="true"

그런데 실제로 코드를 돌려보면, 포커싱이 가지 않는 이상 marquee 효과가 일어나지 않음을 알 수 있다. 그것은 TextView가 setSelected(ture)가 되지 않기 때문이다. 이는 xml에서 지원하지 않으므로, 다음과 같이 코드상에서 구현해야한다.

TextView textView = (TextView) findViewById(R.id.text_view);
textView.setSelected(true);

이러면, marquee 효과가 잘 된다.

참고 자료

1 2 3 4 5 6 7 8 9 10