간단한 시간표 어플 (myTimetable)

안드로이드 마켓에 간단한 시간표 어플을 등록했다.
마텟 이용방법이 궁금해서 간단히 만들어 보았고, 물론 능력 부족으로 기능도 부족하다.

3일 ------
350 total
215 active installs (61%)

2일 ------

1일 ------
등록한 첫날 96명의 이용자가 다운로드하고 56명의 이용자가 계속 설치한 상태로 있는것 같다.
두건의 이용 평가 등록이 되었고 하나의 댓글이 등록되었다.

댓글 등록자는 예상 밖으로 외국인이었는데, 주말 표시를 없애달라고는 주문이었다.


신고

Trackbacks 0 / Comments 1

Android RingtoneManager

File k = new File(path, "mysong.mp3"); // path is a file to /sdcard/media/ringtone

ContentValues values = new ContentValues();
values
.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values
.put(MediaStore.MediaColumns.TITLE, "My Song title");
values
.put(MediaStore.MediaColumns.SIZE, 215454);
values
.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values
.put(MediaStore.Audio.Media.ARTIST, "Madonna");
values
.put(MediaStore.Audio.Media.DURATION, 230);
values
.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values
.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
values
.put(MediaStore.Audio.Media.IS_ALARM, false);
values
.put(MediaStore.Audio.Media.IS_MUSIC, false);

//Insert it into the database
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
Uri newUri = main.getContentResolver().insert(uri, values);

RingtoneManager.setActualDefaultRingtoneUri(
  myActivity
,
 
RingtoneManager.TYPE_RINGTONE,
  newUri
);
신고

Trackbacks 0 / Comments 0

ContentProvider 만들기 (1)

ContentProvider를 상속 받아 만들면 되겠지 하고 시작하면 뭐 허접한 클래스 하나 나올겁니다.

UriMatcher 도 사용하고 여러 테이블을 한꺼번에 처리하기 위해서는 조금 신경써야 합니다.

조금만 신경쓰면 확장성이 좋은 ContentProvider를 만들 수 있습니다.


public interface baseColumns {

	/**
	 * 아이디
	 */
	final String _ID 		= "_id";
	
	/**
	 * 컬럼 배열을 리턴하는 함수
	 * @return 컬럼 배열 반환 String[]
	 */
	abstract String[] getColumns();
	abstract HashMap getProjection();
	abstract String getTableName();
	abstract String getIdColumnName();
	abstract String[] getRequiredColumns();
	abstract void create(SQLiteDatabase db);
	abstract void drop(SQLiteDatabase db, int oldVersion, int newVersion);
}
이 인터페이스를 베이스로 확장성 있는 Provider 모듈을 만들면 도움이 될것 같습니다.
public class myProvider extends ContentProvider {
	
    private static final String TAG = "myProvider";

    private static final int XXXX		= 1;

	private static final UriMatcher MATCHER;
    
	public static final String URI_STRING = "content://com.sample.Provider/sample";
	public static final String PROVIDER = "com.xxx.Provider";
    public static final Uri CONTENT_URI = Uri.parse(URI_STRING);
    
    private static HashMap MY_PROJECTION;

	static {
		MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
		MATCHER.addURI(PROVIDER, "xxx", XXXX);
	
		MY_PROJECTION = new xxx().getProjection();
	}

	private SQLiteDatabase db;

	@Override
	public boolean onCreate() {
		db=(new databaseHelper(getContext())).getWritableDatabase();		
		return (db == null) ? false : true;
	}
	
	@Override
	public Cursor query(Uri url, String[] projection, String selection,
												String[] selectionArgs, String sort) {
		
		final SQLiteQueryBuilder qb = new SQLiteQueryBuilder();	
		final int nUriType = getUriType(url);
	
		qb.setTables(getTableName(nUriType));
		
		if (isCollectionUri(nUriType)) {
			qb.setProjectionMap(getDefaultProjection(nUriType));
		}
		else {
			qb.appendWhere(getIdColumnName(nUriType)+"="+url.getPathSegments().get(1));
		}
		
		String orderBy;
		
		if (TextUtils.isEmpty(sort)) {
			orderBy=getDefaultSortOrder(nUriType);
		} else {
			orderBy=sort;
		}
	
		Cursor c=qb.query(db, projection, selection, selectionArgs,
											null, null, orderBy);
		c.setNotificationUri(getContext().getContentResolver(), url);
		return c;
	}
	
	private boolean isCollectionUri(int nUriType) {
		switch(nUriType) {		
		case XXXX :
			return false;
		}
		
		return false;
	}

	@Override
	public String getType(Uri url) {
		final int nUriType = getUriType(url);
		if (isCollectionUri(nUriType)) {
			return(getCollectionType());
		}
		
		return(getSingleType());
	}
	
    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode) 
    									throws FileNotFoundException {
        return openFileHelper(uri, mode);
    }
    
	@Override
	public Uri insert(Uri url, ContentValues initialValues) {
		long rowID = 0;
		ContentValues values = null;
		
		if (initialValues == null) {
			return null;
		}
		
		final int nUriType = getUriType(url);
		values = new ContentValues(initialValues);
        if (values == null) return null;
	
		if (!isCollectionUri(nUriType)) {
			throw new IllegalArgumentException("Unknown URL " + url);
		}
		
		for (String colName : getRequiredColumns(nUriType)) {
			if (values.containsKey(colName) == false) {
				throw new IllegalArgumentException("Missing column: "+colName);
			}
		}
	
		populateDefaultValues(values);

		if (rowID > 0) {			
			final Uri uri=ContentUris.withAppendedId(getContentUri(), rowID);
			getContext().getContentResolver().notifyChange(uri, null);
			return uri;
		}
	
		throw new SQLException("Failed to insert row into " + url);
	}
	
	@Override
	public int delete(Uri url, String where, String[] whereArgs) {
		int count = 0;
		long rowId = 0;
		
		final int nUriType = getUriType(url);
		if (isCollectionUri(nUriType)) {
			count=db.delete(getTableName(nUriType), where, whereArgs);
		}
		else {
			String segment=url.getPathSegments().get(1);
			rowId=Long.parseLong(segment);
			count=db.delete(getTableName(nUriType), getIdColumnName(nUriType)+"="
						+ segment
						+ (!TextUtils.isEmpty(where) ? " AND (" + where
						+ ')' : ""), whereArgs);
		}
	
		getContext().getContentResolver().notifyChange(url, null);
		return count;
	}
	
	@Override
	public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
		int count;
		
		final int nUriType = getUriType(url);
		if (isCollectionUri(nUriType)) {
			Log.d(TAG, String.format("update: %s", url.toString()));
			count = db.update(getTableName(nUriType), values, where, whereArgs);
		}
		else {
			final String segment = url.getPathSegments().get(1);
			count = db
					.update(getTableName(nUriType), values, getIdColumnNameToUpdate(nUriType)+"="
							+ "'" + segment + "'"
							+ (!TextUtils.isEmpty(where) ? " AND (" + where
									+ ')' : ""), whereArgs);
		}
		
		getContext().getContentResolver().notifyChange(url, null);
		return count;
	}
	
	private int getUriType(Uri url) {
		return MATCHER.match(url);
	}

	private HashMap getDefaultProjection(int type) {
		HashMap projection = null;
		return projection;
	}
	
	private String getTableName(int type) {
		String sTableName = "";
		return sTableName;
	}
	
	private String getIdColumnName(int type) {
		return "";
	}
	
	private String getIdColumnNameToUpdate(int type) {
		return "";
	}
	
	private String getDefaultSortOrder(int type) {
		return "";
	}
	
	private String getCollectionType() {
		return("vnd.android.cursor.dir/vnd.xxxx.Provider.xxxx");
	}
	
	private String getSingleType() {
		return("vnd.android.cursor.item/vnd.xxxx.Provider.xxxx");
	}
	
	private String[] getRequiredColumns(int type) {
		return null;
	}
	
	private void populateDefaultValues(ContentValues values) {
		final Long now = Long.valueOf(System.currentTimeMillis());
	}
			
	private String getNullColumnHack() {
		//return ("title");
		return null;
	}
	
	private Uri getContentUri() {
		return(CONTENT_URI);
	}
}


코드를 그대로 올리기는 뭐해서 일부를 조금씩 바꾸서 올립니다.
신고

Trackbacks 0 / Comments 0

Android 웹에서 자기 어플 실행시키기


	
	
	

 


신고

Trackbacks 0 / Comments 0

티스토리에 코드 올리기...

스킨 설정에 HTML/CSS 에 

<link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css" />
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js" type="text/javascript"></script>


Brush nameBrush aliasesFile name
Bash/shell bash, shell shBrushBash.js
C# c-sharp, csharp shBrushCSharp.js
C++ cpp, c shBrushCpp.js
CSS css shBrushCss.js
Delphi delphi, pas, pascal shBrushDelphi.js
Diff diff, patch shBrushDiff.js
Groovy groovy shBrushGroovy.js
JavaScript js, jscript, javascript shBrushJScript.js
Java java shBrushJava.js
PHP php shBrushPhp.js
Plain Text plain, text shBrushPlain.js
Python py, python shBrushPython.js
Ruby rails, ror, ruby shBrushRuby.js
SQL sql shBrushSql.js
Visual Basic vb, vbnet shBrushVb.js
XML xml, xhtml, xslt, html, xhtml shBrushXml.js


사용법은

   /**
* SyntaxHighlighter
*/
function foo()
{
if (counter <= 10)
return;
// it works!
}
신고

Trackbacks 0 / Comments 0

www.zdnet.co.kr

노랑색 박스에 네이버 쇼핑이 연결되어 있다...
나만 몰랐나? 이런거는 어디서 퍼오는걸까?

이거다 광고 잖아요 ^^

사용자 삽입 이미지

신고

Trackbacks 0 / Comments 0

내 여자친구를 소개합니다

이 영화를 보면 엽기적인 그녀의 느낌이 묻어 나오는듯합니다.

뭐 저만 그런가요? 뭐 제 느낌 쓰는 거니 뭐라 마시기를...

일단 마지막이 "사랑과 영혼" 마지막을 본뜬것 같아 좀 아쉽지만 그거 하나만으로

아니라고 하기엔 좀 그렇다.

OST도 좋다...

사용자 삽입 이미지

신고

Trackbacks 0 / Comments 0

MeeMix [Internet Radio]

아직은 베타라서.. 일단 스샷만 ^^

사용자 삽입 이미지
 
신고

Trackbacks 0 / Comments 0

소셜 네트워크 ?

 
쇼셜네트워크 = 인맥네트워크 (?)

 
사전적 의미 : 지인 네트워크

 
예시)
A가 인터넷에서 소설을 썼다.
이것을 B와 공유했다.
그리고 B는 C에게 이 소설을 공유했다.
이것으로 A와 C는 직접 알지는 못하지만 소설을 중심으로
서로 관계가 형성된 것이다.
신고

Trackbacks 0 / Comments 0

패킷분석

윈도우용 패킷분석 툴

리눅스용 패킷분석

  • tcpdump (기본적으로 OS에 설치되어 있음)
    • 사용예제(패킷캡쳐 내용을 모두 저장하는 예제이므로, 장시간 사용하지 말것)
      1. <캡쳐> /usr/sbin/tcpdump -n -w /tmp/cap.bin -s 1600 -i eth0 host 218.233.111.157
      2. <분석> /usr/sbin/tcpdump -r /tmp/cap.bin -nvvvvvvXv | less
신고

Trackbacks 0 / Comments 0

티스토리 툴바