android2013. 7. 16. 11:38

* Broadcast Receiver & Battery & SD Card Status
http://blog.naver.com/schweine7?Redirect=Log&logNo=40112813209

* ListView 관련 정보
http://luckfellow.blog.me/90091343589

* 위젯개발 사이트
http://dukci.blog.me/50092342360
http://androidhuman.tistory.com/422
http://www.suppul.com/blog/main/category/?page=10

* 지도 관련 참고사이트
http://gaspotion.tistory.com/33
http://blog.naver.com/kippee?Redirect=Log&logNo=130047234393
http://moozi.tistory.com/76
http://cafe.naver.com/sunschool.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4310
http://blog.naver.com/thtlsgkrtod?Redirect=Log&logNo=40062291147
http://m.androidside.com/bbs/board.php?bo_table=B49&wr_id=12961&sfl=mb_id%2C1&stx=kmj6773
http://lomohome.com/316
http://blog.naver.com/sobakr?Redirect=Log&logNo=60111552682
http://blog.naver.com/macyoo/100110532644
맵에 마커를 여러개 띄우고싶은데
Android Side - http://www.androidside.com/bbs/board.php?bo_table=B49&wr_id=7973 
> itemizedoverlay 로 검색을 해보시면 많은 예제들이 나옵니다. 

* 다이얼로그
http://mainia.tistory.com/555



출처 : http://www.androes.com/notice/95

Posted by 광포한곰돌이
android2013. 7. 16. 11:27


저번 글에서는 홈스크린 위젯의 기초에 대해 알아보았으니, 이번 글에서는 홈스크린 위젯에서 상호작용을 할 수 있도록 버튼을 추가해보겠습니다.


지난번에 작업한 예제를 바탕으로 예제를 만들어보겠습니다. 실습을 시작하기 전에 예제를 미리 준비해주세요.

[어플리케이션 정보]

액티비티
  • SimpleActivity.java (SimpleActivity)

레이아웃
  • simpleactivity.xml (SimpleActivity)
  • simple_widget_layout.xml (위젯 레이아웃)

XML
  • simplewidget.xml (위젯 프로바이더)
API Level
  • 8 (Android 2.2)


이번 강좌에서는 위젯에 버튼을 추가하고, 버튼을 누르면 액티비티를 호출하도록 만들어보겠습니다. 먼저 위젯의 레이아웃을 다음과 같이 수정합니다. 버튼이 하나 추가되었습니다.

[simple_widget_layout.xml]
01.<?xml version="1.0" encoding="utf-8"?>
02.<LinearLayout
04.android:background="@drawable/widget_background_4_1"
05.android:gravity="center"
06.android:layout_height="wrap_content"
07.android:layout_width="fill_parent"
08.>
09.<TextView
10.android:layout_width="wrap_content"
11.android:layout_height="wrap_content"
12.android:textColor="#000000"
13.android:textSize="20dp"
14.android:id="@+id/simple_widget_layout_text"
15.android:text="Hello, Widget!" />
16. 
17.<Button
18.android:layout_width="wrap_content"
19.android:layout_height="wrap_content"
20.android:id="@+id/simple_widget_layout_activity"
21.android:layout_marginLeft="10dp"
22.android:text="Activity" />
23. 
24.</LinearLayout>

다음, 위젯 소스코드를 다음과 같이 수정합니다.

[MySimpleWidget.java]
01.public class MySimpleWidget extends AppWidgetProvider {
02. 
03.@Override
04.public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
05.final int N = appWidgetIds.length;
06. 
07.for (int i=0; i<N; i++) {
08.int appWidgetId = appWidgetIds[i];
09.RemoteViews views = buildViews(context);
10.appWidgetManager.updateAppWidget(appWidgetId, views);
11.}
12.}
13. 
14.private PendingIntent buildActivityIntent(Context context){
15.Intent intent = new Intent(Intent.ACTION_VIEW)
16..setData(Uri.parse("http://google.com"));
17.PendingIntent pi = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
18.return pi;
19.}
20. 
21.private RemoteViews buildViews(Context context){
22.RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.simple_widget_layout);
23.views.setOnClickPendingIntent(R.id.simple_widget_layout_activity, buildActivityIntent(context));
24.return views;
25.}
26.}

버튼을 눌렀을 때 액티비티를 띄우기 위해 buildActivityIntent()에서 PendingIntent를 생성하고, setOnClickPendingIntent()를 통해 버튼을 클릭했을 때 수행할 PendingIntent를 지정합니다. 홈스크린 위젯에서 액티비티를 호출할 때는 액티비티 스택이 없는 상태이므로 Intent.FLAG_ACTIVITY_NEW_TASK 플래그를 지정하여 액티비티가 새로운 태스크에서 실행되도록 지정해야 합니다.

예제를 실행하고, 홈스크린에 위젯을 추가하면 다음과 같이 버튼이 위젯에 버튼이 추가된 모습을 확인하실 수 있습니다.



위젯의 버튼을 누르면 다음과 같이 브라우저가 실행되면서 지정한 페이지가 표시됩니다.




출처 : http://androidhuman.tistory.com/entry/%ED%99%88%EC%8A%A4%ED%81%AC%EB%A6%B0-%EC%9C%84%EC%A0%AF%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EC%9E%90-%EB%B2%84%ED%8A%BC-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0

Posted by 광포한곰돌이
android2013. 7. 16. 11:18

안드로이드에서 연락처 즉, 전화번호부 목록을 가져오는 방법을 알려드리겠습니다.

방법은 Call Log 가져오는 방법과 유사합니다.

AndroidManifest.xml 에 퍼미션 추가

<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />


PhoneBook.java

    private Cursor getURI() 
    {
        // 주소록 URI        
        Uri people = Contacts.CONTENT_URI;
        
        // 검색할 컬럼 정하기
        String[] projection = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.HAS_PHONE_NUMBER };
        
        // 쿼리 날려서 커서 얻기
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";    

        // managedquery 는 activity 메소드이므로 아래와 같이 처리함
        return getContentResolver().query(people, projection, null, selectionArgs, sortOrder);
        // return managedQuery(people, projection, null, selectionArgs, sortOrder);
    }

    public void phoneBook() {
        try {
            Cursor cursor = getURI();                    // 전화번호부 가져오기    

            int end = cursor.getCount();                // 전화번호부의 갯수 세기
            Logger.d("ANDROES", "end = "+end);

            String [] name = new String[end];    // 전화번호부의 이름을 저장할 배열 선언
            String [] phone = new String[end];    // 전화번호부의 이름을 저장할 배열 선언
            int count = 0;    

            if(cursor.moveToFirst()) 
            {
                // 컬럼명으로 컬럼 인덱스 찾기 
                int idIndex = cursor.getColumnIndex("_id");

                do 
                {
                    tempItem = new TempItem();
                    
                    // 요소값 얻기
                    int id = cursor.getInt(idIndex);        
                    String phoneChk = cursor.getString(2);
                    if (phoneChk.equals("1")) {
                        Cursor phones = getContentResolver().query(
                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                null,
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                        + " = " + id, null, null);

                        while (phones.moveToNext()) {
                            phone[count] = phones
                                    .getString(phones
                                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        }        
                    }
                    name[count] = cursor.getString(1);

                    // 개별 연락처 삭제                    
                    // rowNum = getBaseContext().getContentResolver().delete(RawContacts.CONTENT_URI, RawContacts._ID+ " =" + id,null);

                    // LogCat에 로그 남기기
                    // Logger.i("ANDROES", "id=" + id +", name["+count+"]=" + name[count]+", phone["+count+"]=" + phone[count]);
                    count++;
                    
                } while(cursor.moveToNext() || count > end);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


출처 : http://www.androes.com/143

Posted by 광포한곰돌이
android2013. 7. 3. 11:35

일단 현재 위치를 받기위해선  GeolocationPermissions.Callback를 implements 시킨다

( public class 클래스명 extends Activity implements GeolocationPermissions.Callback )


웹뷰 세팅 부분

WebSettings setting = web.getSettings();

setting.setJavaScriptEnabled(true); // 웹뷰에서 자바스크립트 실행 가능

web.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

web.getSettings().setGeolocationEnabled(true);    // 현재위치 연결


String url = "연결 주소";

GeoClient geo = new GeoClient();

web.setWebChromeClient(geo);

String origin = ""; // how to get origin in correct format?

geo.onGeolocationPermissionsShowPrompt(origin, this); // obviously not how this is meant to be used but                 

  // expected usage not documented

web.loadUrl(url);




public void invoke(String origin, boolean allow, boolean remember) {


}


final class GeoClient extends WebChromeClient {


@Override

public void onGeolocationPermissionsShowPrompt(String origin,

Callback callback) {

// TODO Auto-generated method stub

super.onGeolocationPermissionsShowPrompt(origin, callback);

callback.invoke(origin, true, false);

}


}



출처 : http://stackoverflow.com/questions/2267513/using-navigator-geolocation-getcurrentposition-in-webview-on-android-2-0-phone

Posted by 광포한곰돌이
android2013. 7. 2. 17:54

안드로이드 작업을 하다보면 메니페스트 파일에 넣어야하는 User-permission 을 잊거나 생각이

안날경우가 있따. 그래서 일단 적어 놓는다.

</application> 밑에 추가할것 ㅋ

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

//위치정보 확인함
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>

//위치정보 확인함

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

//wifi 연결을 확인함
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

//wifi 체인지를 확인함

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

//네트웍이 연결된것을 확인할수 있게함

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

//부팅완료를 확인할수있게함

<uses-permission android:name="android.permission.INTERNET"/>

// 인터넷을 사용함

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

// 외장메모리 사용

<uses-permission android:name="android.permission.RECODER_AUDIO"/>

//녹음이 가능하게 함

ACCESS_CHECKIN_PROPERTIES 체크인데이터베이스의_속성테이블로_액세스
ACCESS_COARSE_LOCATION 코스_로케이션_액세스_(Cell-ID/WiFi)
ACCESS_FINE_LOCATION 파인로케이션_액세스(GPS)
ACCESS_LOCATION_EXTRA_COMMANDS 로케이션_옵션_커맨드_액세스
ACCESS_MOCK_LOCATION 목_로케이션_프로바이더_생성_(테스트용)
ACCESS_NETWORK_STATE 네트워크_상태_접근
ACCESS_SURFACE_FLINGER 서피스_플링거_접근
ACCESS_WIFI_STATE WiFi상태_접근
ADD_SYSTEM_SERVICE 시스템서비스_추가
BATTERY_STATS 배터리_상태
BLUETOOTH 블루투스
BLUETOOTH_ADMIN 블루투스_어드민
BRICK 디바이스_실효성_지정
BROADCAST_PACKAGE_REMOVED 제거된_패키지에_대한_notification_브로드캐스트
BROADCAST_SMS SMS에_대한_브로드캐스트
BROADCAST_STICKY 인텐트_브로드캐스트
CALL_PHONE 통화
CALL_PRIVILEGED 통화(긴급전화_포함)
CAMERA 카메라
CHANGE_COMPONENT_ENABLED_STATE 컴포넌트의_실효성_변경
CHANGE_CONFIGURATION 컨피그_변경
CHANGE_NETWORK_STATE 통신상태_변경
CHANGE_WIFI_STATE WiFi상태_변경
CLEAR_APP_CACHE 어플리케이션_캐시_클리어
CLEAR_APP_USER_DATA 어플리케이션의_유저데이터_클리어
CONTROL_LOCATION_UPDATES 위치정보_갱신
DELETE_CACHE_FILES 캐시파일_제거
DELETE_PACKAGES 패키지_제거
DEVICE_POWER 전원상태에_대한_로우레벨_접근
DIAGNOSTIC 진단리소스_읽고쓰기
DISABLE_KEYGUARD 키_가드_끄기_DUMP_덤?
EXPAND_STATUS_BAR 상태표시줄_확장
FACTORY_TEST 팩토리_테스트
FLASHLIGHT 플래시라이트
FORCE_BACK 포스백
GET_ACCOUNTS 어카운트_획득
GET_PACKAGE_SIZE 패키지_획득
GET_TASKS 태스크_획득
HARDWARE_TEST 하드웨어테스트
INJECT_EVENTS 유저이벤트_키/트랙볼
INSTALL_PACKAGES 패키지_인스톨
INTERNAL_SYSTEM_WINDOW 내부_시스템윈도_활용
INTERNET 인터넷
MANAGE_APP_TOKENS 어플리케이션_토큰관리
MASTER_CLEAR 마스터_클리어
MODIFY_AUDIO_SETTINGS 오디오설정_편집
MODIFY_PHONE_STATE 전화상태_편집
MOUNT_UNMOUNT_FILESYSTEMS 파일시스템_편집
PERSISTENT_ACTIVITY 액티비티_지속
PROCESS_OUTGOING_CALLS 전화_발신처리_접근
READ_CALENDAR 캘린더_읽어오기
READ_CONTACTS 주소록_읽어오기
READ_FRAME_BUFFER 프레임버퍼_읽어오기
READ_INPUT_STATE 입력상태_읽어오기
READ_LOGS 로그_읽어오기
READ_OWNER_DATA owner_data읽어오기
READ_PHONE_STATE 통화상태_읽어오기_READ_SMS_SMS읽어오기
READ_SYNC_SETTINGS 동기설정_읽어오기
READ_SYNC_STATS 동기상태_읽어오기
REBOOT reboot
RECEIVE_BOOT_COMPLETED boot완료
RECEIVE_MMS MMS수신
RECEIVE_SMS SMS수신
RECEIVE_WAP_PUSH WAP수신
RECORD_AUDIO 오디오_수신
REORDER_TASKS 태스크_Z오더
RESTART_PACKAGES 패키지_리스타트
SEND_SMS SMS송신
SET_ACTIVITY_WATCHER 액티비티_왓쳐지정
SET_ALWAYS_FINISH 액티비티_전체_종료
SET_ANIMATION_SCALE 스케일_애니메이션_지정
SET_DEBUG_APP 디버그어플리케이션_지정
SET_ORIENTATION 스크린_로테이션지정
SET_PREFERRED_APPLICATIONS 자주_사용하는_어플리케이션_지정
SET_PROCESS_FOREGROUND 포어그라운드_처리지정
SET_PROCESS_LIMIT 제한처리_지정
SET_TIME_ZONE 타임존_지정
SET_WALLPAPER 배경화면_지정
SET_WALLPAPER_HINTS 배경화면_힌트_지정
SIGNAL_PERSISTENT_PROCESSES 지속처리_시그널_지정
STATUS_BAR 상태표시줄_지정
SUBSCRIBED_FEEDS_READ 서브스트립드_피즈_읽어오기
SUBSCRIBED_FEEDS_WRITE 서브스트립드_피즈_쓰기
SYSTEM_ALERT_WINDOW 알림_윈도우
VIBRATE 진동
WAKE_LOCK 알람
WRITE_APN_SETTINGS APN설정_쓰기
WRITE_CALENDAR 캘린더_쓰기
WRITE_CONTACTS 주소록_쓰기
WRITE_GSERVICES G서비스_쓰기
WRITE_OWNER_DATA owner_data쓰기
WRITE_SETTINGS 설정_쓰기
WRITE_SMS SMS쓰기
WRITE_SYNC_SETTINGS 동기설정_쓰기


출처 : http://javaexpert.tistory.com/329

Posted by 광포한곰돌이
android2013. 7. 1. 09:11

웹뷰안에서 alert 를 하면 서버 host url이 나타난다.. 그걸 없애주기위해선 아래처럼 따로 구현을 해줘야함.



webView.setWebChromeClient(new ChromeClient() {

   

   @Override

   public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result){

      new AlertDialog.Builder(view.getContext())

         .setTitle("메세지")

         .setMessage(message)

         .setPositiveButton(android.R.string.ok,

               new AlertDialog.OnClickListener(){

                  public void onClick(DialogInterface dialog, int which) {

                     result.confirm();

                  }

               })

         .setCancelable(true)

         .create()

         .show();


      return true;

   };

   

   @Override

   public boolean onJsConfirm(WebView view, String url, String message, final android.webkit.JsResult result){

      new AlertDialog.Builder(view.getContext())

         .setTitle("메세지")

         .setMessage(message)

         .setPositiveButton(android.R.string.ok,

               new DialogInterface.OnClickListener() {

                  public void onClick(DialogInterface dialog, int which) {

                     result.confirm();

                  }

               })

         .setNegativeButton(android.R.string.cancel,

               new DialogInterface.OnClickListener() {

                  public void onClick(DialogInterface dialog, int which) {

                     result.cancel();

                  }

               })

         .create()

         .show();


      return true;

   };

   

  });

Posted by 광포한곰돌이
android2013. 7. 1. 09:10

//진동

Vibrator vibe = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

  vibe.vibrate(500);    

  

//진동은 Manifast.xml 파일에 권한을 추가해줘야 한다.

<uses-permission android:name="android.permission.VIBRATE" />



//화면이 잠겨 있을때 켜지게 하기

  getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD

    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);


출처 : http://titis.tistory.com/entry/%ED%99%94%EB%A9%B4-%EC%BC%9C%EC%A7%80%EA%B2%8C-%ED%95%98%EA%B8%B0-%EB%B0%8F-%EC%A7%84%EB%8F%99%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

Posted by 광포한곰돌이
android2013. 7. 1. 09:03

private class MyWebClient extends WebViewClient {

  public boolean shouldOverrideUrlLoading(WebView view, String overrideUrl) {

   if(overrideUrl.startsWith("http://")){

    return false;

   }

   else {

    boolean override = false;

    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(overrideUrl));

    intent.addCategory(Intent.CATEGORY_BROWSABLE);

    intent.putExtra(Browser.EXTRA_APPLICATION_ID, getPackageName());

    if (overrideUrl.startsWith("sms:")) {

     Intent i = new Intent(Intent.ACTION_SENDTO, Uri.parse(overrideUrl));

     startActivity(i);

     return true;

    }

    if (overrideUrl.startsWith("tel:")) {

     Intent i = new Intent(Intent.ACTION_CALL, Uri.parse(overrideUrl));

     startActivity(i);

     return true;

    }

    if (overrideUrl.startsWith("mailto:")) {

     Intent i = new Intent(Intent.ACTION_SENDTO, Uri.parse(overrideUrl));

     startActivity(i);

     return true;

    }

    try{

     startActivity(intent);

     override = true;

    }

    catch(ActivityNotFoundException ex) {}

    return override;

   }

  }

 };



하나씩 다 지정 해줘야 함.. 물론 권한도 포함해서요~;)


전화걸기 권한

<uses-permission android:name="android.permission.CALL_PHONE" /> 



출처 :  http://titis.tistory.com/entry/%EC%9B%B9%EB%B7%B0WebView-%EC%95%88%EC%97%90%EC%84%9C-tel-%EB%B0%8F-sms-mailTo-%ED%83%9C%EA%B7%B8-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

Posted by 광포한곰돌이
android2013. 6. 30. 17:56

add. 좌표로 서울 화면만 보기

 Map.java 파일에 
         MapView eventMap; //선언을 해주고

        onCreate함수 안에..

        eventMap = (MapView)findViewById(R.id.eventMapView);
       //eventMap.setSatellite(true); //위성GPS화면으로 보기
        eventMap.setBuiltInZoomControls(true);
        GeoPoint vMap = new GeoPoint(37566535, 126977969);
        MapController map = eventMap.getController();
        map.animateTo(vMap);
        map.setZoom(15);


add2. 주소로 GPS 좌표 찾기

 XML   : http://maps.google.co.kr/maps/api/geocode/xml?address=[찾을주소]&sensor=true
 JSON : http://maps.google.co.kr/maps/api/geocode/json?address=[찾을주소]&sensor=true

        ※ 위 좌표값에 1,000,000을 곱하고 반올림해서 자연수로 변환한후, "GeoPoint()"에게 넘겨줘야 합니다~

check. 
   구글맵의 GPS 정보는 자바를 기준으로 JSON 방식과 XML 방식으로 데이터를 제공하는데 XML은 사람이 이해하기 쉬 
   태그 방식으로 표기 하지만 JSON은 컴퓨터가 빨리 인식하도록 하기 위해 객체와 배열 구조로 만들어졌음. 편한걸로 이용^^





출처 : http://titis.tistory.com/entry/%EA%B5%AC%EA%B8%80%EB%A7%B5-Google-Map-%EC%82%AC%EC%9A%A9-comgoogleandroidmaps

Posted by 광포한곰돌이
android2013. 6. 10. 18:02

String latlongString;


String addressString = "No address found";

double latitude = Double.valueOf(bb[0]).doubleValue();

double longitude = Double.valueOf(bb[1]).doubleValue();


Geocoder gc = new Geocoder(this, Locale.KOREAN);


try {

List<Address> addresses = gc

.getFromLocation(latitude, longitude, 1);

StringBuilder sb = new StringBuilder();


if (addresses.size() > 0) {

Address address = addresses.get(0);

for (int i = 0; i < address.getMaxAddressLineIndex(); i++)

sb.append(address.getAddressLine(i)).append("\n");


/* 

* 우편번호는 나오지 않음

*/

sb.append(address.getCountryName()).append(" "); // 나라코드

                                sb.append(address.getLocality()).append(" "); // 시

              sb.append(address.getSubLocality() + " ");   // 구

              sb.append(address.getThoroughfare()).append(" "); // 동

              sb.append(address.getFeatureName()).append(" "); // 번지

                

addressString = sb.toString();

}


} catch (IOException e) {

e.printStackTrace();


}


String aaa = "당신의 현재 위치는 \n" + bb[0] + ", " + bb[1] + "이고 \n\n" + "주소는 \n"

+ addressString + "입니다";


System.out.println(aaa);




내 소스에 맞게 만들어진 소스이다.

Posted by 광포한곰돌이