정말 초간단한 구글 위치 찾기 입니다.

보통 몇시간이면 만들수 있는 어플이라 백업용으로 올림

 

  초본:

1차 수정본:

서버단에서 단어검색 목록을 가져와서 뿌려주는 간단한 어플 입니다.

특징은 상태표시줄에 항상 대기중이라는 특징..^^

예를 들면 스마트폰으로 PDF통해 원서공부중 단어검색이 필요할 때 보통 다른 어플에 들어가서 실행하고 하는 과정에서 흐름이 계속 끊기더군요..^^

그래서 그냥 후딱 검색하는 사전어플입니다..압축파일안에 apk만 있습니다..^^

기능추가 및 버그신고는 무조건 100프로 해드리도록 노력하겠습니다..^^

밑의 자료 소스는  
메일 보내드리기 귀찮음 : 비번 : javaexpert

암호는 댓글 요청시 바로 보내드립니다. 수고하세영


Actvity는 총 2개이며 한개는 simple이용한거랑 BaseExpandableListAdapter이용한 거랑 있습니다.

보시다 시피 아주 간단한 ExpandableListView 의 단적인 예입니다.(1시간만에 만든 예제치곤 허접그대로입니다..^^;;;)




싱글쓰레드로 이루어진 상당히 간단한 UDP 에코 서버랑 클라이언트 파일 2개임

한개는 UDP 서버랑
다른 한개는 UDP 클라이언트이다

그럼 참고파일은

테스트위해 간단하게 짠겁니다..^^

소스 :
(불펌 방지 암호필요:댓글 달아주시면 암호 보내드립니다.^^)

왕초보가 왕초보님께 드리는 팁입니다.

단계
1.어떤 A라는 Activity를 실행시켰습니다.(화면에 계속 보여주고 있는 상태)
2.그리고 A가 서비스를 실행시켰습니다.
3.그리고 바인딩시켰습니다..서비스 퍼블릭된 자원을 맘껏 쓰고 있습니다...
4.그런데 막상 다시 서비스가 지금 보여주고 있는 화면에 값을 넘겨주고 싶을때가 있더군요.
5.그럴때 이용하는 방법입니다.

1.A Activity를 실행해서 버튼 클릭하면 PendingIntent를 보냅니다.그냥 Intent를 보내도 무방함(물론 서비스도 실행된상태임)
01.PendingIntent pIntent = 
02.     PendingIntent.getService(getBaseContext(), 0, 
03.       new Intent(ExamService.ACTION_FILTER), PendingIntent.FLAG_ONE_SHOT);
04.    try {
05.     pIntent.send();
06.    } catch (Exception e) {
07.     // TODO: handle exception
08.     e.printStackTrace();
09.    }
10.  
11.//브로드 리시버 등록
12.        this.registerReceiver(receiver, new IntentFilter(ExamService.ACTION_FILTER));

2.서비스 내에선 데이타 담아서 방송해줍니다.
1.super.onStart(intent, startId);
2.    
3.  //PendingIntent에 Intent 첨부해서 보내므로 바로 인자로 넣어주면 실행됨
4.  intent.putExtra("msg", "안드로이드가 맛있다눈!!^^");
5.    
6.  this.sendBroadcast(intent);
7.    
8.  this.onDestroy();

3.그럼 다시 A라는 Activity에서 방송을 받아서 맴버 메소드를 실행시킵니다.

01.private BroadcastReceiver receiver = 
02.     new BroadcastReceiver(){
03.   @Override
04.   public void onReceive(Context context, Intent intent) {
05.    // TODO Auto-generated method stub
06.    process.append("SERVICE BROADCATING THIS!!\n");
07.    String msg = intent.getStringExtra("msg");
08.    if(msg!=null)
09.     doProcess(msg);
10.    process.append("IT'S DONE!!\n");
11.   }     
12.    };


이런식으로 서비스에서 보여주고 있는 Activity에 데이타를 담아서 메소드를 실행시킵니다.

물론 aidl를 이용하면 더 효율적이라는 데..아무리 봐도 잘 이해가 안가네요..(제수준에선)^^

아무튼 저랑 같이 고민하고 있는 분들을 위해서 적어봤습니다.

풀소스는 제 블로그( http://javaexpert.tistory.com )에서 받을수 있습니다.

오늘도 수고하세요^^
mp3 player를 만드는 도중 첫번째 단계가 탐색기라서 한번 만들어봤습니다.

화면구성은 다음과 같습니다.

(암호필요)


학습내용
1. 기본 ListActivity에 커스텀 Adapter 활용
2.기본적인 자바 파일입출력
3.기본적인 화면 전환 에니메이션 활용(overridePendingTransition사용)

기본적인 탐색기라서 별 설명드릴 것도 없는듯..

최종 루트가 SD카드로 정해놓았습니다.

그리고 풀소스는 불펌방지 위해 암호설정했습니다.

암호필요하신 분은 댓글에 메일주소적어주시면 보내드리겠습니다..수고하세요^^

freedraw.zip


작성자의 티스토리 : http://javaexpert.tistory.com


다름이 아니라 이번에 처음으로 만든 어플이 있어서 올려봅니다.

올리는 이유는 펍가족님들에게 조언 좀 얻을려구영..^^;



device.pngmain.png

 

 

용기있는 왕초보의 프로젝트입니다..이름은 허접한 그림메모 어플..^^;;;;;; ==;

어플 기능 소개

1.기본적인 리스트

2.미리보기 기능 구현

3.프리드로우 기능 구현(자바 그대로 구현)

4.옵션 메뉴 기능 구현

학습된 내용

1.커스텀 CursorAdapter 공부

2.인텐트 기본 공부

3.Bitmap 기본 변환 공부

4.기본 입출력 공부

5.기본 직렬화 IO 공부

6.DB 기본 컨트롤 공부 등등

단 2장짜리 어플이지만 상당히 공부된 걸로 판단됩니다..^^;;

최적화는 못했습니다..아직 실력이..T.T

사인안된 .apk하나랑 (unsigned랑 sign이랑 있는데 뭔지 잘 모르겠음..ㅋ)

풀소스 올려봅니다. 아주 초보분들은 조금이라도 도움될듯..고수분들에게 보이기엔 상당히 부끄럽습니다..^^;

이제 몇개월만 더 하면 과정 끝나서 안드로이드 취업해야 하는데.... 더 분발해야 할듯..

혹시 여기 올리면 안되면 바로 지우겠습니다..


작성자 블로그 : http://javaexpert.tistory.com
작성자 메일주소 : bear2u@naver.com


저번 발로 만든 어플 첫번째인 그림메모에 이어 두번째 어플을 만들긴 했습니다.

너무 소스가 부끄러워 그냥 제 블로그에다 넣을려고 했으나 저랑 비슷한 왕초보분들이 상당히 많이 계신것 같아서 또 용기있게 올려봅니다.


 

개략 설명============================================================================
일반 핸드폰에 있는 매시간 알림
서비스입니다.

기본 UI는 한장이며(솔직히 디자인도 어려운 안드로이드임..==;)
alarm1.png
alarm2.png

소스또한 그리 어렵지는
않습니다..하지만 이걸 구현하기 위한 저의 개발시간은 또 일주일..^^;

그리고 AlarmManager 의 setRepeating도
있는 데 Interval로 주기적으로 하는 건데 이상하게 하다 꼬여
서 그냥 주기적으로 Set하면 다시 Set하는 방식으로
했는데..참 난감합니다..^^;;


학습내용

1.broadreceive 기본적인 사용방법 숙지
2.Service 기본
구현방법 숙지
3.인텐트 필터 공부
4.알람메니저 기본 구현방법 숙지
5.Preference 사용방법 숙지..(이것도 하다
BroadReceive에서 받아올줄 몰라서 DB로 바꿔서 이 소스에선 안씀..^^;;

아무튼 간단한 거라도 만드니 상당한 공부가
되는 건 확실하네요^^

그럼 간략하게 소스 설명해드리겠습니다.

하지만 먼저..버그가 좀 있습니다.

1.알람시간이 정확하게 정해지지가 않습니다.
예)5시에 올려야 하는 데 5시 10초정도에 울린다던가..그런경우..도저히 못 잡겠음..T.T
...아시는 분 댓글 부탁..
2.BroadReceive나 Service에서 preference에 접근할려면 어떻게 해야 하는 지 모르겠네요

(아시는 분 댓글 부탁드립니다)

소스는 다음과 같습니다..

대략적인 프로세스 흐름은

1.엑티비티를 실행하면 위와 같은 한장의 UI가 나옵니다.
2. 그럼 실행 클릭합니다.
3.인텐트 액션명을 지정해서 Broad합니다.그럼 Receiver가 받겠죠?

1.intent = new Intent();
2.intent.setAction("org.exam.Alarm_action");
3.this.sendBroadcast(intent);

4.Receiver에선 서비스를 실행합니다.

1.Intent mIntent = new Intent(context,AlarmService.class);   
2.  mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
3.  if(!dbHandler.getIsFirst())
4.   new MyThread(context).start();
1.context.startService(mIntent);

5.서비스에서 AlarmManager를 객체 생성후 배운대로 PendingIntent를 설정합니다..(책보고 하긴 했지만 아직 머하는 놈인지 자세히는..)

1.AlarmManager manager =
2.   (AlarmManager)getSystemService(Context.ALARM_SERVICE);
3.   
4.  Intent mIntent = new Intent(AlarmService.this,BroadAlarmManager.class);
5.  mIntent.putExtra("id",1);
6.  PendingIntent sender = PendingIntent.getBroadcast(AlarmService.this,0,mIntent,0);

6.이제 문제의 Calendar를 설정합니다..(솔직히 이부분에서 조언을 받았으면 합니다..)

01.Calendar calendar = Calendar.getInstance();
02.calendar.setTimeInMillis(System.currentTimeMillis());
03. 
04.int mHour = calendar.get(Calendar.HOUR);
05.int mHin = calendar.get(Calendar.MINUTE);
06.int mSec = calendar.get(Calendar.HOUR);
07. 
08.Log.i("Time","1:"+mHour);
09.Log.i("Time","2:"+mHin);
10.Log.i("Time","3:"+mSec);
11. 
12.calendar.add(Calendar.MINUTE, 59-mHin);
13.calendar.add(Calendar.SECOND, 60-mSec);
14. 
15.mHour = calendar.get(Calendar.HOUR);
16.mHin = calendar.get(Calendar.MINUTE);
17.mSec = calendar.get(Calendar.HOUR);

대략 위의 소스대로 하면 다음 알람 시간은 예) 6시 00분 07초에서 10초사이에 설정됨

7.이제 AlarmManager으 Set으로 설정합니다.

1.manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
2. 
3.Toast.makeText(this, "알람등록완료", Toast.LENGTH_SHORT).show();

8.그럼 시간이 지나고 또 지나고 매시간 정각이 되는 순간이 아니라..좀 몇초지나서..ㅋㅋ 소리가 나옵니다..(띵똥 몇시..)

소리 나오는 건 Receiver에서 옵션을 잡아서 재생하게 합니다.

여기선 쓰레드를 이용해서 하긴 했지만 뭐 굳이 안해도 될것 같더군요...^^;

01.MyThread(Context ctx){
02.   this.mCtx = ctx;
03.   calendar = Calendar.getInstance();
04.   calendar.setTimeInMillis(System.currentTimeMillis());
05.   AudioManager mAudioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);
06.   volume =  mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
07.  }
08.  public void run(){
09.    
10.    
11.   /*
12.   int hour = calendar.get(Calendar.MINUTE);
13.    
14.   String sHour = String.valueOf(hour);
15.    
16.   if(sHour.length() >1)
17.    sHour = sHour.substring(1, sHour.length());
18.    
19.   Log.i("Receive","hour:"+sHour);
20.   */
21.   //int am = calendar.get(Calendar.AM);
22.    
23.   int tHour = calendar.get(Calendar.HOUR);
24.   Log.i("Time","thread hour : "+tHour);
25.   //if(am==0)
26.    //tHour--;
27.   MediaPlayer mp = MediaPlayer.create(mCtx, getHourVal(tHour));
1.mp.setVolume(volume, volume);
2. mp.start();
3.  
4.  
5.}


그럼 여기서 생기는 의문은 왜 Activity에서 바로 알람을 실행안하고 이렇게 약간 복잡하게 할까..

그건 부팅후에도 실행할려고 하기 때문입니다.

인텐트 필터를 적용해 액션 및 부팅 후 Broad도 잡게끔 되어있습니다.

서비스 등록및 filter 적용한 부분입니다.

1.<service android:name="AlarmService"/>
2.<receiver android:name=".BroadAlarmManager">
3. <intent-filter>
4.  <action android:name="android.intent.action.BOOT_COMPLETED" />
5.  <action android:name="org.exam.Alarm_action" />
6.   
7. </intent-filter>
8.</receiver>


이상으로 간략적인 흐름은 끝냈습니다.

적다보니 상당히 간단하지만....하지만..힘들지만 재미있네요^^

풀소스는 여전히 밑에 첨부되어 있으니 보고 마구 지적해주세요. 지적은 대환영입니다..^^

여담이지만 이 어플은 항상 요양원에 계시는 아버지께서 갤럭시를 사드렸는데 시간알리미가 없어서 불편하다가 해서 기존에 있는 걸 까는 것 보다 자식이 만든 걸 깔아 드리게 되었습니다. 지금 만족하시네요^^

그럼 다들 수고하세요.


참으로 싼티난다..그래도 처음 플젝이니깐..ㅋ

능구현
1.확인 클릭시 DB에서 ID조회
2.저장 클릭시 DB에 저장함.

학습목표
1.안드로이드 기본 UI구현
2.안드로이드 기본 DB접속 이해
3.안드로이드 개발 과정 아주 조금이해..==;

LoginExamAct.java
package com.test;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;


public class LoginExamAct extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
private String txtId = null;
private String txtPwd =  null;
private LoginDBHelper mDBHelper = null;
private ContentValues cv = null;
private String MEMBERID = "memid";
private String PWD = "pwd";
private SQLiteDatabase db = null;
private MyAlertDialog alert= null;
private EditText et = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mDBHelper = new LoginDBHelper(this);
       // System.out.println("콘솔화면나옴?");
        Log.i("tag insert","hello");
        alert = new MyAlertDialog(this);
        Button idBtn =(Button)findViewById(R.id.findId);
        Button pwdBtn =(Button)findViewById(R.id.register);
        txtId = (idBtn).getText().toString();
        //txtPwd = (pwdEdit).getText().toString();
        idBtn.setOnClickListener(this);
        pwdBtn.setOnClickListener(this);
        
        
        Log.i("KTH","here ok");               
    }
    public void onClick(View view){
     txtId = (et=(EditText)findViewById(R.id.entryId)).getText().toString();
        txtPwd = ((EditText)findViewById(R.id.pwd)).getText().toString();  
        Boolean ans = false;
        switch(view.getId()){            
     case R.id.findId :    
     ans = isExistMemID(txtId);
     et.setText(ans+"");
     break;
     case R.id.register :        
     if(!isExistMemID(txtId)){
     alert.setMessage("중복된ID가 있음");
     }
     db = mDBHelper.getWritableDatabase();
     cv = new ContentValues();
     cv.put(MEMBERID,txtId);
         cv.put(PWD,txtPwd);        
         db.insert("member",null, cv);        
     break;
        }
     //alert.setMessage(txtId+","+txtPwd);
     //alert.show();
    
    }
    public Boolean isExistMemID(String varID){
     Boolean ans = false;
     if(varID==null)
     return ans;
    
     db = mDBHelper.getWritableDatabase();
     String sql = "select memId,pwd from member where memID='"+varID.trim()+"'";
     Cursor cursor = db.rawQuery(sql, null);
if(cursor.getCount()==0){
ans = !ans;
}
     return ans;
    }
    class MyAlertDialog extends AlertDialog.Builder{
     MyAlertDialog(Context ctx){
     super(ctx);
     this.setNeutralButton("닫기", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//기본적으로 창이 닫히고, 추가 작업은 없다.
}
});    
     }
     @Override
     public AlertDialog.Builder setMessage(CharSequence msg){
     super.setMessage(msg);
     this.show();
     return this;
     }
    }
    public void doLogin(View btn){
    
     /*
     try {
     txtId = ((EditText)findViewById(R.id.entryId)).getText().toString();
            txtPwd = ((EditText)findViewById(R.id.pwd)).getText().toString();
            
            Toast.makeText(this, getResult(txtId,txtPwd), Toast.LENGTH_SHORT);
            
            switch(btn.getId()){            
             case R.id.findId :
             db = mDBHelper.getWritableDatabase();
             String query = "select memId,pwd from member where memId='"+txtId+"'";
             Cursor cursor = db.rawQuery(query, null);
             /*
             if(cursor.isNull(1)){
             Toast.makeText(this,"자료없음",Toast.LENGTH_SHORT);
             }else{
             Toast.makeText(this,"있음 : "+txtId,Toast.LENGTH_SHORT);
             }
             Toast.makeText(this, "체크중",Toast.LENGTH_SHORT);
             break;
             case R.id.register :
             db = mDBHelper.getWritableDatabase();
             cv = new ContentValues();
             cv.put(MEMBERID,txtId);
                 cv.put(PWD,txtPwd);
                
                 db.insert("member",null, cv);
             break;
             default :
            
            }
        
        
        
        
        
         //Toast.makeText(this,getResult(txtId,txtPwd), Toast.LENGTH_SHORT).show();
} catch (Exception e) {
// TODO: handle exception
Log.i("error",e.toString());
}
    
     */
    }
    
    public String getResult(String id,String pwd){
     StringBuffer resultStr = new StringBuffer();
     resultStr.append("id=");
     resultStr.append(id);
     resultStr.append(",pwd=");
     resultStr.append(pwd);
     return resultStr.toString();
    }
    
}

class LoginDBHelper extends SQLiteOpenHelper{
public LoginDBHelper(Context context){
super(context,"login",null,1);
}
public void onCreate(SQLiteDatabase db){
db.execSQL("create table member(_id INTEGER PRIMARY KEY AUTOINCREMENT,memId TEXT,pwd TEXT);");
}
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
db.execSQL("drop table if exists member");
onCreate(db);
}
}

2.main.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 로그인화면 -->
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="1"
android:paddingTop="10px">
<TableRow>
<TextView  
   android:text="@string/login"
   android:padding="10px"    
   />    
  <EditText android:id="@+id/entryId"
   android:layout_span="3"
   android:padding="10px" 
   android:autoText="false"  
   />    
</TableRow>
<TableRow>
<TextView  
    android:text="@string/pwd"
    android:padding="10px"    
   />    
  <EditText android:id="@+id/pwd"
    android:layout_span="3"
    android:padding="10px"
    android:autoText="false"   
   />
</TableRow>
<TableRow>
<TextView
android:layout_span="2"
/>
<Button android:id="@+id/findId"
android:text="@string/ok"
/>
<Button android:id="@+id/register"
android:text="@string/cancel"
/>
</TableRow>
</TableLayout>

3.string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, LoginExamAct!</string>
    <string name="app_name">LoginExam</string>
<string name="login">아이디:</string>
<string name="ok">검색</string>
<string name="cancel">저장</string>
<string name="pwd">비밀번호:</string>
</resources>

+ Recent posts