'Android App'에 해당되는 글 24건

  1. 2015.07.25 쓰레드(Thread) 정지하고 다시 시작하는법
  2. 2015.07.23 handler를 이용해 Thread UI 해결하기
  3. 2015.07.22 안드로이드 커스텀 이벤트 등록
  4. 2015.07.16 외부 라이브러리 jar 만들고 연동방법
  5. 2014.10.28 [android] kitcat 에서 refresh gallery 문제 (3)
  6. 2014.09.03 ADB 에러 - more than one device
  7. 2014.08.28 ImagePager SetCurrentItem으로 강제로 이동시 Smooth 하게 이동하기
  8. 2014.08.27 앱 종료 시점알기, 앱종료인지 아니면 Activity끼리 전환인지 구분
  9. 2014.08.21 안드로이드 InternalStrage에 파일저장할때 하위폴더를 만들어서 읽기
  10. 2014.08.19 이미지 RadioButton 다양한 해상도 지원하게 하기
  11. 2014.08.18 layout 가운데 정렬
  12. 2014.08.18 Action Bar 숨기기
  13. 2014.08.14 버튼에 상태 변화에 따라 효과 넣기
  14. 2014.08.13 Custom ListView 만들기
  15. 2014.08.13 file size 나타내기 간략하게...
  16. 2014.08.12 텍스트 파일 및 이미지 파일 저장 하기
  17. 2014.08.12 안드로이드내부에서 페이지 이동 Activity간의 이동
  18. 2014.05.26 [android] Eclipse에서 메서드 정의로 이동시 인터페이스(Interface)가 아닌 구상(Implementation) 클래스의 정의로 이동하기
  19. 2014.05.26 [android] string.xaml에 정의된 string 사용하기
  20. 2014.05.26 [android] 3G 인지 WIFI인지 체크하기
  21. 2014.05.15 [android] 직접실행창이 없는 이클립스에서 비슷하게 구현하기(inspect 이용)
  22. 2014.05.13 [android] Thread에서 UI Update하기
  23. 2014.05.13 [Android] Thread를 이용한 UDP Server/Client 만들기
  24. 2014.05.09 [Android] 자기 아이피 받기
Android App2015.07.25 17:30

찾아볼 시간이 없어서 그냥 간단한 방법으로 하였다,


public void connect(String nullMsg) {

broadCastThread = new Thread(new Runnable() {

public void run() {

try {

while (!broadCastThread.interrupted()) {

//구현

}

} catch (Exception e) {

e.printStackTrace();

}

}

});


broadCastThread.start();


}

그리고 멈출때는 


if (broadCastThread != null && broadCastThread.isAlive()) {

broadCastThread.interrupt();


그리고 다시 시작할때는 어쩔수 없이 connect()메소드를 다시 호출한다. 그냥 전역 쓰레드를 다시 정의해서 스타트 돌리는 꼼수이다.


wait, nofify도 된다는데 안되서 조금더 조사를 해봐야 할듯~

Posted by 동동(이재동)
Android App2015.07.23 11:46

Handler mHandler = new Handler();


핸들러를 만들고

Thread 안에 이렇게 쓰면  UI를 변경할수 있다.

mHandler.post(new Runnable() {
public void run() {
mTV.setText(msg);
}
});

더 좋은 방법이 있지만 간단하게 사용할려면 이게 편한듯

참고 : http://blog.naver.com/slrkanjsepdi/90116465979


Posted by 동동(이재동)
TAG Handler, Thread, UI
Android App2015.07.22 11:37

일단 커스텀 이벤트 등록


public interface MessageEventListener {

void onMessageEventListener(String msg);


}


이벤트를 보내기 위한 리스너 생성  (예: bc라는 클래스라고 하자)


public MessageEventListener mMessageListener;


public void setOnMessageListener(MessageEventListener listener){

mMessageListener = listener;

}



이벤트 받을 클래스에 리스너 등록

bc.setOnMessageListener(new MessageEventListener(){


@Override

public void onMessageEventListener(String msg) {

// TODO Auto-generated method stub

Log.i("CustomEvent", "Event Message : "+msg);

}

});



bc라는 클래스에서 이벤트를 호출 

mMessageListener.onMessageEventListener(msg);




Posted by 동동(이재동)
Android App2015.07.16 13:34



1. 같은 워크스페이스에 안드로이드 빈프로젝트를 하나 만들고 src에 클래스 파일을 만든다.


2. libs에 > import > General > File System > jar가 위치한 폴더를 선택 > 원하는 jar 파일만 체크하여 추가.

  (폴더는 해당 bin에 자동으로 생성된 jar파일을 직접 선택)


3. 빌드패스에서  라이브러리 > Add JAR> lib폴더에 있는 jar 을 직접 선택


4. 메소드 실행후에  class 를 찾을수 없다는 메세지가 나오면 폴더 선택 버튼을 누르고 라이브러리 플더 자체를 선택한다.



Posted by 동동(이재동)
Android App2014.10.28 14:12

기존 킷켓 이전에는

 

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));

 

이렇게해서 겔러리를 갱신했었지만

 

킷캣부터 이렇게 바꼈다

private void galleryAddPic() {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File f = new File(mCurrentPhotoPath);
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
}

 

대신에 저 photoPath에 경로를 주는것이 아니라 업로드한 사진 경로 풀경로를 줘야 한다는것이다. 파일이름까지

 

참고 : http://www.codeproject.com/Questions/689342/Refresh-gallery-in-android-kitkat

Posted by 동동(이재동)
Android App2014.09.03 16:44

주로 이클립스에서 안드로이드 장치를 연결한 후 발생하는 에러.

 

실행 중에 운용하는 기기는 한 대 뿐인데 추가적으로 똑같은 기기가 더 출력되면서

 

정상적으로 실행이 안될때가 있다.

 

more than one device 또는 more than one device and emulator 에러 발생시

 

"cmd"에서 adb위치로 이동한다.

 

>> cd C:\Android\platform-tools

>> adb kill-server

>> adb start-server

Posted by 동동(이재동)
Android App2014.08.28 17:49
setCurrentItem(count,true);

 

마지막에 true는 스무스하게 움직이게 하는거다

 

는 무슨.... 작동이 안된다.

 

그래서  ViewPager를 상속받아서 새로 만들었다.

 

package com.example.redcarpetwall;

import java.lang.reflect.Field;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;

public class ImageSlidePager extends ViewPager{
 
 public ImageSlidePager(Context context) {
        super(context);
    }

    public ImageSlidePager(Context context, AttributeSet attr) {
        super(context, attr);
        setMyScroller();
    }
   
   
  
    private void setMyScroller()
    {
      try
      {
              Class<?> viewpager = ViewPager.class;
              Field scroller = viewpager.getDeclaredField("mScroller");
              scroller.setAccessible(true);
              scroller.set(this, new MyScroller(getContext()));
      } catch (Exception e)
      {
          e.printStackTrace();
      }
    }
   
    public class MyScroller extends Scroller
    {
      public MyScroller(Context context)
      {
          super(context, new DecelerateInterpolator());
      }

      @Override
      public void startScroll(int startX, int startY, int dx, int dy, int duration)
      {
          super.startScroll(startX, startY, dx, dy, 1000 /*1 secs*/);
      }
    }
}

 

그러니 잘 작동한다.


이건 imageslide adapter

 

package com.example.redcarpetwall;

import android.R;
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

public class ViewPagerAdapter extends PagerAdapter {

 Activity activity;
 int imageArray[];

 public ViewPagerAdapter(Activity act, int[] imgArra) {
  imageArray = imgArra;
  activity = act;
 }

 public int getCount() {
  return imageArray.length;
 }

 public Object instantiateItem(View collection, int position) {
  ImageView view = new ImageView(activity);
//  view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
//    LayoutParams.FILL_PARENT));
  view.setScaleType(ScaleType.FIT_XY);
  //view.setBackgroundResource(imageArray[position]);
  view.setImageResource(imageArray[position]);
  ((ViewPager) collection).addView(view, 0);
  return view;
 }

 @Override
 public void destroyItem(View arg0, int arg1, Object arg2) {
  ((ViewPager) arg0).removeView((View) arg2);
 }

 @Override
 public boolean isViewFromObject(View arg0, Object arg1) {
  return arg0 == ((View) arg1);
 }

 @Override
 public Parcelable saveState() {
  return null;
 }
}

 

이건 xml

<com.example.redcarpetwall.ImageSlidePager
     android:id="@+id/imageSlidePager1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" >
 </com.example.redcarpetwall.ImageSlidePager>

 

 

귀찮아서 그냥 다 복불 ㅎㅎ

 

나중에 시간 되면 정리해야겠다.

 

참고한 사이트

이미지 슬라이드 : http://androidtrainningcenter.blogspot.kr/2012/10/viewpager-example-in-android.html


 

 

Posted by 동동(이재동)
Android App2014.08.27 11:48

 public static boolean isApplicationSentToBackground(final Context context) {
      ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
      List<RunningTaskInfo> tasks = am.getRunningTasks(1);
      if (!tasks.isEmpty()) {
        ComponentName topActivity = tasks.get(0).topActivity;
        if (!topActivity.getPackageName().equals(context.getPackageName())) {
          return true;
        }
      }

      return false;
    }

 

onPause()를 오버라이드 해서

 

 

boolean temp = isApplicationSentToBackground(this);

 

사용하면 된다.

 

true일때는 사용자가  홈버튼을 눌렀을때 혹은 앱을 나갔을때

 

false일때는 나가지 않고 activity로 이동

Posted by 동동(이재동)
Android App2014.08.21 12:14

역시 삽질을 함으로써 실력이 느는건가...

 

구글링을 이틀동안 했다.... ㅠㅠ

 

일단 내가 원하는건

 

이미지 전송받아서 특정폴더에 저장을 하고 위부  이미지 프로그램을로 이미지를 읽는것이였다.

 

한폴더에 저장하는것이야 쉽다.

 

FileOutputStream os = openFileOutput(filename,
     Context.MODE_WORLD_READABLE);

 

 

new FileOutputStream 을 쓰지 못한 이유는 바로 저 !!!!! 권한문제 때문이다....

 

권한이 읽는권한이 있어야..(바로 그냥 CHMOD 쓰고 싶다~~~~~~~ㅠㅠ)

 

Intent를 이용해서 외부에서 이미지를 읽을수 가있다.

 

저게 날 엄청나게 괴롭혔다..

 

일단 openFileoutput은 인자로 String을 받는데 여기서 경로는 못받는다. 오로지 파일이름만 받을수 있다!!!!

 

그러면 이게

 

/data/data/앱이름/files 에 저장이 된다.

 

하지만 난 서브폴더를 만들고 싶었다.

 

/data/data/앱이름/files/서브폴더

 

혹시나 openFileoutput 에 경로를 지정할수 있을까 해서 찾아봤지만 택도 없는소리!!!

 

그렇다면 일단 files폴더에 받아서 copy하면 어떨까... 하... 역시 카피 하는것도 new FileOutputStream을 이용해서 그냥 복사하는거뿐.... ㅠㅠ 그래서 copy받은 파일은 권한이 없다

 

그렇다면 파일에 권한을 직접 줄수는 없을까?

 

file.setReadable(true, false);

 

이렇게 해도 안되길레 아 이건원래 안되나 싶었는데

 

지푸라기 잡는 심정으로

 

intent를 사용하기전에

new java.io.File(mItem.get(position).GetPath()).setReadable(true, false);

 

이런식으로 강제로 읽기 권한을 주니!!!

 

으악!!!!! 된다..

 

이제 더럽고 치사한 openFileoutput쓰지말고 당당하게 new FileoutputStream을 쓰고 나중에 권한 설정만 바꾸자.

 

참고로 폴더도 read되게 만들었다.

 

 File dir = getDir("Gallery", Context.MODE_WORLD_READABLE);
 dir.mkdir();

 

 

 

 

 

 

.

 

 

 

Posted by 동동(이재동)
Android App2014.08.19 16:17

역시 기초가 있어야 되는가보다.. ㅎㅎ

 

이미지 라디오 버튼이야 널린게 예제지만 다양한 해상도에 맞게 px를 디자이너랑 dp로 계산해 가며 적용하였는데

 

hdpi에서는 잘맞지만 xhdpi, xxhdpi에서는 이미지가 짤려나왔다....

 

결국 성공한것은 weight를 이용한 퍼센트로 맞추기였다...

 

라디오 그룹안에 2개의 라디오버튼 있는데

 

각각 weight를 0.5로 맞추니 dp로 맞출랑 달리 잘 맞았다.

 

대신 이미지도 dp로 맞추는게 아니라 각해상도에 따라서 맞춰야 한다.... 정확히 반으로 해상도 width가 1080임으로

 

이미지도 540으로 나누었다 그러니까 맞는게 아닌가....

 

아무튼 dp로 하지말고 퍼센트로 하자

 

Posted by 동동(이재동)
Android App2014.08.18 11:34

일단 가운데 정렬을 위해서는

 

FlameLayout 보다는 RelativeLayout을 사용하는것이 더 좋다....

 

xml에 이런식으로 사용하면 된다.

 android:layout_centerVertical="true"
 android:layout_centerHorizontal="true"  

 

wpf에서는 grid만 해두 충분했는데 크흑 ㅠㅠ

 

 

Posted by 동동(이재동)
Android App2014.08.18 11:10

@Override
 public void onCreate(Bundle savedInstanceState)
 { 
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.filelist_view);

 

이부분을 추가하면 된다.

  requestWindowFeature(Window.FEATURE_NO_TITLE);

 

ActionBar actionbar = getActionBar()를 할경우 액션바를 지원하지 않는 이전버전에는 오류가 발생하기도 하고 컴파일이 안된다.

 

그래서 위방법으로 하자

 

스타일로 하는 방법도 있으나 저 위에 방법이 깔끔하다

 

참고 :   http://jystudynote.tistory.com/entry/Android%EC%95%A1%EC%85%98%EB%B0%94-%EC%97%86%EC%95%A0%EA%B8%B0

 

Posted by 동동(이재동)
Android App2014.08.14 16:28

일단 res/drawable 폴더가 없으면 만든다.

 

그안에 xml 파일을 하나 넣는다 예제로 button_state.xml로 이렇게 넣는다.

 

헷갈렸던거는 drawable-hdmi, drawable-xhdmi,drawable-xxhdmi 이렇게 각 해상도 별로 폴더가 있는데

 

다 넣어야 되어야하는건가란느 의문이였다...

 

하지만 버튼 눌렀을때 와 보통 이미지는 그냥 저 폴더에 넣고

 

xml 파일만 drawable에 담는다....

 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <!-- selected -->
     <item android:state_selected="true"
        android:drawable="@drawable/btnfileviewer_press" />
     <!-- pressed -->
     <item android:state_pressed="true"
        android:drawable="@drawable/btnfileviewer_press" />
    <!-- focused -->
    <item android:state_focused="true"
        android:drawable="@drawable/btnfileviewer_press" />
    <!-- default -->
    <item android:drawable="@drawable/btnfileviewer_normal" />
</selector>

 

디폴트는 맨마지막에 넣어야 된다고 한다....

 

그리고 마지막으로 이미지 폴더에 저 selector를 적용한다.

 

 

<ImageButton
        android:id="@+id/imageButtonListOpen"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="68dp"
        android:background="@android:color/transparent"
        android:src="@drawable/fileviewerbuttonstate" />

 

src에 xml 파일이름을 넣어주면 된다.

 

android:src="@drawable/fileviewerbuttonstate"

 

참고한곳 : http://www.androes.com/99

 

'Android App' 카테고리의 다른 글

layout 가운데 정렬  (0) 2014.08.18
Action Bar 숨기기  (0) 2014.08.18
버튼에 상태 변화에 따라 효과 넣기  (0) 2014.08.14
Custom ListView 만들기  (0) 2014.08.13
file size 나타내기 간략하게...  (0) 2014.08.13
텍스트 파일 및 이미지 파일 저장 하기  (0) 2014.08.12
Posted by 동동(이재동)
Android App2014.08.13 13:45

인터넷 검색하면 너무나도 많기 때문에

 

내가 유용했던 블러그를 적어둔다.

 

http://postbook.tistory.com/entry/%EC%BB%A4%EC%8A%A4%ED%85%80-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%B7%B0%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%99%80-%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C

 

안드로이드에서 ListView 커스텀은 WPF보다는 Cell 계념의 IOS와 더 비슷하다고 보면 되겠다...

 

결국 Model 하나 만들어서

 

Adapater를 만든후

 

FileListAdapter fileList = new FileListAdapter(this, R.layout.filelist_row, mItem);
        mlistView.setAdapter(fileList);

 

이런식으로 아답터를 셋해주면 된다.

 

여기서 R.layout.filelist_row는 IOS의 경우 Cell  WPF에서는 ItemTemplate 계념이라고 보면 된다.

 

그외 참고 한사이트

http://androidhuman.tistory.com/entry/11-List-%EC%A7%91%EC%A4%91%EA%B3%B5%EB%9E%B5-3-Custom-ArrayAdapter%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-ListView

Posted by 동동(이재동)
Android App2014.08.13 13:41
String mFileSize = Formatter.formatShortFileSize(getBaseContext(),file.length());

 

포맷터를 이용하자 항상 편하다.

Posted by 동동(이재동)
Android App2014.08.12 17:34

안드로이드에서

 

getFilesDir().getAbsolutePath();

를 하게 되면

앱내부에서 저장할수 있는 Path를 알수 있다.

 

data/data/앱이름/files 에 저장이 된다.

 

하지만 여기에 강제로 저장을 하게 되면 ..이렇게

 

String dirPath = getFilesDir().getAbsolutePath();

File saveFile = new File(dirPath+"/test.txt");
FileOutputStream fos = new FileOutputStream(saveFile);

 

읽기,쓰기 등등 아무 권한이 없는 파일이 생성된다.

 

그래서 나중에 이 파일을 읽을려고해도 읽을수가 없다... 물론 파일은 보인다.

 

수정된 코드는 이렇다.

 

 FileOutputStream fos = openFileOutput("test2.txt",Context.MODE_WORLD_READABLE);

 

 MODE_PRIVATE  혼자만 사용하는 배타적인 모드로 파일 생성 .. (디폴트)
 MODE_APPEND  파일이 이미 존재할 경우 덮어쓰기 모드로 열지 않고 추가 모드로 연다. ( 기존 내용에 추가 )
 MODE_WORLD_READABLE  다른 응용 프로그램이 읽을 수 있도록 허용
 MODE_WORLD_WRITEABLE  다른 응용 프로그램이 쓸 수 있도록 허용

 

이렇게 모드를 바꾼후에야 된다...

 

참고 :  http://enosent.tistory.com/4

 

이미지 파일은

 

  AssetManager manager = getAssets();
        InputStream open;
  try {
       open = manager.open("WhiteBall.jpg");
       Bitmap bitmap = BitmapFactory.decodeStream(open);
       FileOutputStream os = openFileOutput("WhiteBall.jpg",Context.MODE_WORLD_READABLE);        
       bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
       os.close();
   
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 

이렇게 asset에서 파일을 불러와서 예제를 작성하였다.

 

 

 

 

 

 

 

Posted by 동동(이재동)
Android App2014.08.12 14:42

페이지간의 Navigation하는것을 안드로이드에서는

 

Activity로 전환하기로 부른다.

 

머 페이지 이동이다...

 

일단 안드로이드에서는

 

/src 폴더에 비하인드로 사용할 java파일을 만들고

 

res/layout/   폴더에 view로 사용할 xml 파일을 만든다. 파일명은 소문자만 가능하다. ㅡ.ㅡ;;;;!!!

 

자바는 귀찮게 또 manifest에 등록을 해줘야 한다.. C#처럼 자동으로 등록하지 않는다 ... ㅠㅠ

 

 <application
        android:allowBackup="true"
        android:icon="@drawable/appicon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".TakeOutMainActivity"
            android:label="@string/title_activity_main"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>           
        </activity>
        <activity  android:name="FileListActivity"></activity> <---이런식으로
    </application>

 

 

이런식으로 manifest에 등록후에

 

아까 만든 View와 behind에 쓰일 java 파일을

 

public class FileListActivity extends Activity  {
 
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.filelist_view);
 }
}

 

이런식으로 연결하고....

 

메인뷰에서  클릭이벤트가 발생될시에

 

 Intent intent = new Intent(TakeOutMainActivity.this,FileListActivity.class);
     startActivity(intent);

 

intent를 이용해서 이동하면 된다.

 

참고 :  http://croute.me/514

 

Posted by 동동(이재동)
Android App2014.05.26 11:24
Android App2014.05.26 11:22

 

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="hello">Hello World</string>

</resources>

 

 

someTextView.setText(getString(R.string.hello));

 

이렇게 사용~

Posted by 동동(이재동)
Android App2014.05.26 11:17

AndroidManifest.xml에 아래를 추가

 

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

 

 

주석은 그냥 참고~

 

private boolean IsWifiConnected() {
     ConnectivityManager connManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
     //NetworkInfo state_3g = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
     NetworkInfo state_wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    
     if(state_wifi.isConnected() == true)
      return true;    
     else
      return false;
    
     //return state_3g.isConnected() || state_wifi.isConnected();
 }
 

 

Posted by 동동(이재동)
Android App2014.05.15 10:37

아 이클립스 정말... 최악이다...

 

2002년쯤에는 이클립스 우와 좋다 이랬었는데

 

비쥬얼스튜디오의 엄청난 버프를 받다보니.... 비쥬얼스튜디오와 비교될수도있고 익숙하지도 않을수도 있고..

 

디버깅도 구리고 오류처리 능력도 먼가 이상하다...

 

예전 아이폰할때 Xcode욕했었는데 이건머 ... 안드로이드 개발하면서 와...Xcode는 양반이구나 생각했다..

 

일단 이클립스는직접실행창이 없기 때문에 Expressions에 의지하는방법밖에 없나했었는데

 

어라 이클립스는 디버깅중에 코드입력이 가능했다.

 

거기다가 inspect라는 기능을 이용하면 비슷하게 구현가능했따.

 

방법은 코드를 입력후 드래그해서 선택후 Ctrl+Shift+I 누르면 된다..끝~

 

 

 

 

Posted by 동동(이재동)
Android App2014.05.13 16:01

여러가지 방법이 있지만 아래와 post를 이용해 해보았다.

 

다른 방법은 천천히 공부해봐야겠다.

 

recieveMsgTextView.post(new Runnable(){
     public void run() {
      recieveMsgTextView.setText(msg);
     }
    });

 

 

참고 :http://variousapp.egloos.com/1403533

 

Posted by 동동(이재동)
Android App2014.05.13 14:52

피씨와 폰과의 UDP 연결을 위해서 만들어 보았다.

일단 서버 부분이다.

만약 이렇게 쓰레드를 이용하지 않으면 UI가 나오기전에 계속 메세지를 리시브 받을 준비를 함으로 UI가 나오지 않는다.

쓰레드를 이용해서 메세지는 메세지대로 받고 다른 처리는 다른처리대로 하자.

 

static으로 해야하며 UI Update는 c# 의 Dispatcher가 없는데 post라는 메소드가 있어서 이용하였다.

 

static String msg;
 private static void runUdpServer() {
  new Thread(new Runnable() {
   public void run() {
    try{
    int serverPort = 11000;   
    DatagramSocket socket = new DatagramSocket(serverPort);
    
    while(true)
    {
    byte[] buf = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buf,buf.length);
    socket.receive(packet);
    msg = new String(packet.getData(),0,packet.getLength());    
    recieveMsgTextView.post(new Runnable(){
     public void run() {
      recieveMsgTextView.setText(msg);
     }
    });
    }
   }catch(Exception e)
   {
    Log.d("test","r: Error");
   }
   }
    
  }).start();
 }

 

이건 안드로이드에서 메세지를 보내는 부분이다. 보내는부분은 쓰레드를 특별히 이용하지 않았다.

 

button.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {
    Button clickedButton = (Button) v;

    try {

     byte[] buf = MsgEditText.getText().toString().getBytes();

     InetAddress serverAddr = InetAddress
       .getByName("192.168.10.37");

     DatagramSocket socket = new DatagramSocket();

     DatagramPacket out_datagramPacket = new DatagramPacket(buf,
       buf.length, serverAddr, 12800);
     socket.send(out_datagramPacket);

    } catch (UnknownHostException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (SocketException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  });

 

참조 : http://blog.naver.com/PostView.nhn?blogId=aoba0203&logNo=130169841108&beginTime=0&jumpingVid=&from=section&redirect=Log&widgetTypeCall=true

Posted by 동동(이재동)
Android App2014.05.09 10:36

 

public String getLocalIpAddress() {
        try {
                Enumeration<NetworkInterface> en =  NetworkInterface.getNetworkInterfaces();               
                while(en.hasMoreElements()) {
                       NetworkInterface interf = en.nextElement();                      
                       Enumeration<InetAddress> ips = interf.getInetAddresses();
                            while (ips.hasMoreElements()) {
                              InetAddress inetAddress = ips.nextElement();
                              if (!inetAddress.isLoopbackAddress()) {
                                      return inetAddress.getHostAddress().toString();
                           }
                    }
                }
        } catch (SocketException ex) {
                //Log.e("Error", ex.toString());
         System.out.println(ex.toString());
         
        }
            return null;
      }

 

여러가지 소스를 찾아봤지만 이게 가장 깔끔한거 같다...

 

만약 그냥 저소스를 그대로 쓰면 에러가 난다.

 

NetworkInterface.getNetworkInterfaces();               

 

이부분 에서 exception이 나는데 권한이 없다고 나와서 보니

 

manifest에

 

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

 

를 추가하니 잘되었다.

Posted by 동동(이재동)