728x90
반응형
SMALL


안녕하세요, 안드로이드 개발자 여러분! 앱 개발은 끊임없는 학습과 효율적인 도구 사용의 연속이죠. 특히 요즘은 AI 기술의 발전으로 개발 생산성을 비약적으로 높여주는 다양한 AI 코딩 도구들이 등장하고 있습니다. 이 글에서는 안드로이드 스튜디오에서 앱 개발을 더욱 편리하게 만들어 줄 무료 AI 플러그인들을 소개해 드리겠습니다.


왜 AI 코딩 플러그인이 필요할까요?
AI 코딩 플러그인은 단순히 코드 자동 완성 기능을 넘어섭니다. 복잡한 로직을 제안하고, 버그를 찾아내며, 심지어 단위 테스트 코드까지 생성해주는 등 개발자의 든든한 조력자 역할을 합니다. 반복적인 작업을 줄여주고, 새로운 아이디어를 코드로 빠르게 구현할 수 있도록 도와주어 결과적으로 개발 시간을 단축하고 코드 품질을 향상시키는 데 기여합니다.
안드로이드 스튜디오에서 사용하기 편리한 무료 AI 플러그인 추천
안드로이드 스튜디오는 JetBrains IntelliJ IDEA 기반이므로, IntelliJ 플러그인 생태계를 활용할 수 있습니다. 다음은 현재 가장 유용하게 사용할 수 있는 무료 AI 플러그인들입니다.


1. Gemini in Android Studio (Gemini Code Assist) - Google의 공식 지원!
* 무엇인가요? Google이 직접 개발하여 안드로이드 스튜디오에 내장되거나 플러그인 형태로 제공되는 AI 코딩 어시스턴트입니다. Google의 최신 Gemini 모델을 기반으로 하며, 안드로이드 개발에 최적화되어 있습니다. 개인 개발자에게는 현재 무료로 제공됩니다.
* 주요 기능:
   * AI 코드 완성 및 생성: 작성 중인 코드를 자동으로 완성하거나, 주석 및 자연어 설명을 바탕으로 전체 함수나 코드 블록을 생성합니다.
   * 코드 변환/개선: 기존 코드를 다른 형태로 변환하거나, 더 효율적인 코드로 개선하는 제안을 받을 수 있습니다.
   * 코드 설명 및 단위 테스트 생성: 복잡한 코드를 설명해주어 이해를 돕고, 코드에 대한 단위 테스트를 자동으로 생성해줍니다.
   * 크래시 보고서 분석: 크래시 보고서를 분석하여 문제 해결을 위한 제안을 받을 수 있습니다.
   * 챗 인터페이스: IDE 내에서 Gemini와 직접 대화하며 코딩 관련 질문을 하고 도움을 받을 수 있습니다.
* 장점: 안드로이드 개발에 특화되어 있으며, Google의 공식 지원을 받으므로 가장 안정적이고 지속적인 기능 개선을 기대할 수 있습니다.
* 설치 및 사용: 안드로이드 스튜디오 최신 버전에서 "설정(Settings)" > "Gemini" 섹션에서 기능을 활성화하고 컨텍스트 공유에 동의하면 됩니다.


2. Codeium - 무료 무제한 AI 코딩의 강자
* 무엇인가요? 개인 사용자에게는 무료로 코드 완성, 채팅, 코드 생성 등 강력한 AI 코딩 기능을 무제한으로 제공하는 플러그인입니다.
* 주요 기능:
   * 코드 자동 완성 및 생성: 작성 중인 코드를 예측하여 완성하거나, 자연어로 설명을 입력하면 해당 코드를 생성해줍니다.
   * 인라인 채팅: 코드 에디터 내에서 AI와 직접 대화하며 질문하고 코드를 생성하거나 개선할 수 있습니다.
   * 코드 설명/리팩토링: 기존 코드를 분석하여 설명하거나, 더 나은 코드로 리팩토링할 수 있는 제안을 합니다.
* 장점: 무료이면서도 기능이 매우 풍부하며, Kotlin과 Java를 포함한 대부분의 주요 프로그래밍 언어를 지원합니다.
* 설치 및 사용: JetBrains Marketplace에서 "Codeium" 플러그인을 검색하여 설치하면 됩니다.


3. Tabnine - 스마트한 코드 완성 전문가
* 무엇인가요? 강력한 AI 기반의 코드 완성 도구로, 작성 중인 코드를 실시간으로 분석하여 다음 코드를 예측하고 제안합니다.
* 주요 기능:
   * 스마트한 코드 완성: 한 줄 완성부터 전체 함수 완성까지 다양한 수준의 코드 제안을 제공하여 오타를 줄이고 개발 속도를 높여줍니다.
   * 다양한 언어 지원: Kotlin, Java는 물론 다른 여러 프로그래밍 언어를 지원합니다.
* 장점: 무료 버전도 상당한 수준의 코드 완성 기능을 제공하며, 로컬에서 실행되는 옵션이 있어 개인 정보 보호에 강점을 가질 수 있습니다.
* 설치 및 사용: JetBrains Marketplace에서 "Tabnine" 플러그인을 검색하여 설치할 수 있습니다.


4. Cody by Sourcegraph - 코드베이스 이해에 탁월
* 무엇인가요? 단순히 코드 완성뿐만 아니라 전체 코드베이스를 이해하고 질문에 답변하는 데 강점을 가진 AI 어시스턴트입니다.
* 주요 기능:
   * 코드 완성 및 생성: 자연어 프롬프트와 현재 작업 중인 코드베이스의 컨텍스트를 기반으로 코드를 제안하고 생성합니다.
   * 코드 질문/설명: 코드의 특정 부분이나 전체 프로젝트에 대해 질문하고 AI의 상세한 설명을 들을 수 있습니다.
   * 코드 리팩토링 및 디버깅 지원: 코드 개선 및 문제 해결을 위한 제안을 제공하여 효율적인 디버깅을 돕습니다.
* 장점: 대규모 코드베이스에서 작업할 때 특히 유용하며, 코드의 문맥을 깊이 이해하는 능력이 뛰어납니다. 무료 티어가 제공됩니다.
* 설치 및 사용: JetBrains Marketplace에서 "Cody" 플러그인을 검색하여 설치할 수 있습니다.


한글 사용에 대한 팁 (중요!)
현재 대다수의 AI 코딩 도구는 영어 기반으로 학습되고 개발되었습니다. 따라서 영어 프롬프트에 가장 최적화된 응답을 제공합니다.
하지만 최신 LLM(거대 언어 모델)들의 한글 이해 능력이 비약적으로 발전했기 때문에, 한국어로 지시를 내려도 상당 부분 이해하고 코드를 생성해낼 수 있습니다. 특히 Gemini in Android Studio나 ChatGPT 플러그인(JetBrains Marketplace에서 검색) 같은 경우, 한글 프롬프트 이해도나 한글 주석/설명 생성 능력이 비교적 뛰어난 편입니다.
한글로 질문하거나 지시할 때는 문맥을 명확하게 제시하고, 가급적 전문적인 코딩 용어를 사용하는 것이 AI의 이해도를 높이는 데 도움이 됩니다.


마무리하며
위에 소개해 드린 무료 AI 플러그인들은 안드로이드 스튜디오에서 앱 개발 생산성을 높이는 데 큰 도움이 될 것입니다. 각 플러그인마다 강점이 다르므로, 직접 설치해보고 본인의 개발 스타일과 프로젝트에 가장 적합한 도구를 찾아보시길 권해드립니다. AI의 도움을 받아 더욱 빠르고 효율적인 안드로이드 개발을 경험해 보세요!


# 안드로이드 # 스튜디오 # AI 코딩 # 무료 플러그인 # Gemini Android Studio # Codeium # Tabnine # Cody # AI 개발 보조 # 개발 생산성 # 안드로이드 개발

728x90
반응형
LIST
728x90
반응형
SMALL

handshake failed; returned -1, SSL error code 1, net_error -200

안드로이드 인증서 오류발생

개발 단계에서 인증서 관련 내용을 무시하면 해결됨.

 

                webViewClient = object : WebViewClient() {
                    override fun onReceivedSslError(
                        view: WebView?,
                        handler: SslErrorHandler?,
                        error: SslError?
                    ) {
//                        super.onReceivedSslError(view, handler, error)
                        handler!!?.proceed()
                    }

 

참고 : https://blog.naver.com/jbin_k/220998537342

728x90
반응형
LIST
728x90
반응형
SMALL
java.lang.SecurityException: getLine1NumberForDisplay: Neither user 10791 nor current process has android.permission.READ_PHONE_STATE, android.permission.READ_SMS, or android.permission.READ_PHONE_NUMBERS

유심이 있는 디바이스에서 번호를 가져오는중에 에러 발생

 

원인은 권한 부족

READ_PHONE_STATE
READ_SMS
READ_PHONE_NUMBERS

3가지 권한에 대한 확인을 하면 정상작동한다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)

12버전부터 발생하는 내용

728x90
반응형
LIST
728x90
반응형
SMALL

BuildConfig 파일을 찾을수 없다.

import도 안된다

 

build.gradlew(:app) 파일에서

android {
    buildFeatures {
        buildConfig = true
    }
}

 

buildFeatures { buildConfig = true} 추가해주면 해결됨

728x90
반응형
LIST
728x90
반응형
SMALL

앱 개발 시

studio를 통해서 디버그 모드로 앱을 빌드할때가 많다.

이럴때는 문제가 없지만, 해당앱을 일반 모드로 빌드해서 실행할때도 디버깅을 기다리라는 버그가 발생한다.

studio 문제인지, android 문제인지, 기기 문제인지 모르겠지만

해결책은 adb로 디버그를 종료시켜주면 된다.

 

studio에서 터미널을 열고 아래 내용을 실행하면 해결된다.

 

adb shell am clear-debug-app

728x90
반응형
LIST
728x90
반응형
SMALL

안드로이드 앱 개발에서 자주 사용되는 두 가지 언어, Java와 Kotlin의 차이점과 각각의 장단점에 대해 알아보겠습니다.

### 1. Java

#### 개요
Java는 안드로이드 앱 개발의 전통적인 언어로, 1995년에 처음 출시되었습니다. 오랜 시간 동안 사용되어 온 언어로, 많은 자료와 커뮤니티 지원을 받고 있습니다.

#### 장점
- **성숙도**: Java는 오랜 역사를 가지고 있어 안정적이고 검증된 언어입니다.
- **풍부한 라이브러리**: 많은 라이브러리와 프레임워크가 존재하여 다양한 기능을 쉽게 구현할 수 있습니다.
- **커뮤니티 지원**: 방대한 사용자층과 자료가 있어 문제 해결이 용이합니다.
- **다양한 플랫폼 지원**: Java는 안드로이드 외에도 서버, 데스크탑, 임베디드 시스템 등 다양한 플랫폼에서 사용됩니다.

#### 단점
- **冗長性(장황함)**: 코드가 상대적으로 길어지고 복잡해질 수 있습니다.
- **NullPointerException**: Null 관련 오류가 발생할 위험이 높습니다.
- **일부 현대적 기능 부족**: 다른 최신 언어에 비해 최신 프로그래밍 패러다임을 지원하는 데 한계가 있습니다.

### 2. Kotlin

#### 개요
Kotlin은 JetBrains에서 개발한 현대적인 프로그래밍 언어로, 2011년에 출시되었습니다. 2017년 구글이 공식적으로 안드로이드 개발 언어로 채택하면서 주목받게 되었습니다.

#### 장점
- **간결성**: 코드가 짧고 명확하여 가독성이 높습니다. 불필요한 코드가 줄어듭니다.
- **Null 안전성**: 언어 차원에서 NullPointerException을 방지할 수 있는 기능이 내장되어 있습니다.
- **확장 함수**: 기존 클래스에 새로운 기능을 추가할 수 있어 코드 재사용성이 높습니다.
- **코루틴 지원**: 비동기 프로그래밍을 쉽게 처리할 수 있는 코루틴을 지원하여 효율적인 동시성 처리가 가능합니다.

#### 단점
- **학습 곡선**: Java에 비해 상대적으로 새로운 언어이기 때문에 초보자에게는 학습이 어렵게 느껴질 수 있습니다.
- **파일 크기**: Kotlin으로 작성된 코드가 Java보다 파일 크기가 커질 수 있습니다.
- **생태계의 성숙도**: Java에 비해 생태계와 자료가 상대적으로 적은 편입니다.

### 결론

Java와 Kotlin은 각각의 장단점이 있으며, 개발자의 필요와 프로젝트의 요구 사항에 따라 선택할 수 있습니다. Java는 안정성과 성숙도를 중시하는 개발자에게, Kotlin은 간결성과 현대적 기능을 원하는 개발자에게 적합합니다. 현재 안드로이드 개발에 있어 Kotlin이 점점 더 많이 사용되고 있지만, Java 역시 여전히 중요한 위치를 차지하고 있습니다. 따라서 두 언어 모두 잘 이해하고 활용하는 것이 중요합니다.

728x90
반응형
LIST
728x90
반응형
SMALL



## jQuery Mobile과 Android JavaScript Bridge를 이용한 모바일 애플리케이션 개발


모바일 애플리케이션 개발에서 jQuery Mobile은 빠르고 간편하게 사용자 인터페이스를 만들 수 있는 프레임워크입니다. Android 애플리케이션 내에서 JavaScript와 상호작용할 수 있는 JavaScript Bridge를 활용하면, 웹 기술과 네이티브 기능을 결합할 수 있습니다. 이번 포스트에서는 jQuery Mobile과 Android JavaScript Bridge를 이용한 예제를 소개하겠습니다.


### 1. 준비 사항


- **Android Studio**: Android 개발 환경.
- **jQuery Mobile**: UI 프레임워크.
- **WebView**: Android 애플리케이션 내에서 웹 콘텐츠를 표시하는 컴포넌트.


### 2. Android 애플리케이션 설정


먼저, Android 프로젝트를 생성하고 WebView를 설정합니다.


#### Gradle에 의존성 추가


```groovy
implementation 'androidx.appcompat:appcompat:1.3.1'
```


#### AndroidManifest.xml 설정


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


#### MainActivity.java 설정


```java
import android.os.Bundle;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import androidx.appcompat.app.AppCompatActivity;


public class MainActivity extends AppCompatActivity {


    private WebView webView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        webView = findViewById(R.id.webview);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        
        // JavaScript Interface 추가
        webView.addJavascriptInterface(new WebAppInterface(), "Android");


        // jQuery Mobile 페이지 로드
        webView.loadUrl("file:///android_asset/index.html");
    }


    // JavaScript와 상호작용하는 클래스
    public class WebAppInterface {
        @JavascriptInterface
        public void showToast(String message) {
            Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
        }
    }
}
```


### 3. jQuery Mobile 페이지 만들기


`assets` 폴더에 `index.html` 파일을 생성하고 jQuery Mobile을 포함시킵니다.


```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>jQuery Mobile과 Android Bridge</title>
    <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
    <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
</head>
<body>
    <div data-role="page" id="home">
        <div data-role="header">
            <h1>jQuery Mobile과 Android Bridge</h1>
        </div>
        <div data-role="content">
            <h2>Android와 상호작용하기</h2>
            <button id="btnShowToast">토스트 메시지 보기</button>
        </div>
    </div>


    <script>
        $(document).ready(function() {
            $("#btnShowToast").click(function() {
                // Android의 JavaScript Bridge를 통해 메소드 호출
                Android.showToast("Hello from jQuery Mobile!");
            });
        });
    </script>
</body>
</html>
```


### 4. 실행 결과


이제 애플리케이션을 실행하면, jQuery Mobile로 구성된 페이지가 나타납니다. "토스트 메시지 보기" 버튼을 클릭하면 Android의 `showToast` 메소드가 호출되어, "Hello from jQuery Mobile!" 메시지가 화면에 표시됩니다.


### 5. 결론


jQuery Mobile과 Android JavaScript Bridge를 결합하면, 모바일 애플리케이션 내에서 웹 기술을 활용하여 유연한 사용자 인터페이스를 제작할 수 있습니다. 이번 포스트에서 소개한 방법을 통해 여러분의 애플리케이션에 다양한 기능을 추가해 보세요!


이 글이 도움이 되길 바라며, 추가 질문이 있다면 언제든지 말씀해 주세요!


--- 


이 포스트가 도움이 되셨기를 바랍니다. 필요하신 부분이 있으면 말씀해 주세요!

해당 게시글은 Ai 자동 글쓰기로 제작되었습니다

728x90
반응형
LIST
728x90
반응형
SMALL

안드로이드(Android)의 에디트텍스트(EditText)는 글자입력이 가능한 컨트롤인데, 처음 키보드는 안드로이드 단말기에 설정된 언어 키보드(Keyboard)가 나오게 됩니다.
필요에 따라서는 한글,영어로 미리 키보드가 변경이 되어있다면 (자판변경/키패드변경 이라고도 하죠) 사용자에게 좀더 편리한 앱을 만들 수 있습니다^^ 

 

<EditText android:id="@+id/input"
		  android:layout_width="300dip"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:inputType="text"
          android:singleLine="true"
          android:privateImeOptions="defaultInputmode=korean"/>



기본키보드를 한글로 하려면 
android:privateImeOptions="defaultInputmode=korean"

영문으로 하려면
android:privateImeOptions="defaultInputmode=english"

 

 

 

 

 

출처 : http://m.blog.naver.com/kkson50/220839013751

728x90
반응형
LIST
728x90
반응형
SMALL

안드로이드에서 디버깅을 할 때 Logcat에 출력되는 내용들을 구분하기 위해 별도의 TAG를 작성합니다.

다음은 파일마다 별도의 TAG를 지정하지 않아도 Logcat에 출력된 클래스와 메소드, 줄 번호를 표시하는 소스코드입니다.

참조한 곳으로 이동(stackoverflow.com)


 

Logcat - Line number 출력하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class Debug {
 
    public static boolean D = true;
 
    private static final int LOG_V = 0;
    private static final int LOG_D = 1;
    private static final int LOG_I = 2;
    private static final int LOG_W = 3;
    private static final int LOG_E = 4;
 
    private static void log(int type, Exception e, String message)
    {
        if (D)
        {
            StackTraceElement l = e.getStackTrace()[0];
 
            String fullClassName = l.getClassName();
            String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
            String methodName = l.getMethodName();
            int lineNumber = l.getLineNumber();
 
            String tag = className + "." + methodName + "():" + lineNumber;
 
            switch (type) {
            case LOG_V:
                Log.v(tag, message);
                break;
            case LOG_D:
                Log.d(tag, message);
                break;
            case LOG_I:
                Log.i(tag, message);
                break;
            case LOG_W:
                Log.w(tag, message);
                break;
            case LOG_E:
                Log.e(tag, message);
                break;
            }
 
            e = null;
        }
    }
 
    public static void logv(Exception e, String message) {
        log(LOG_V, e, message);
    }
 
    public static void logd(Exception e, String message) {
        log(LOG_D, e,  message);
    }
 
    public static void logi(Exception e, String message) {
        log(LOG_I, e,  message);
    }
 
    public static void logw(Exception e, String message) {
        log(LOG_W, e,  message);
    }
 
    public static void loge(Exception e, String message) {
        log(LOG_E, e,  message);
    }
}

로그를 출력하는 부분에서 다음과 같이 사용하면 됩니다.

1
2
3
4
5
Debug.logv(new Exception(), "Something to print");
Debug.logd(new Exception(), "Something to print");
Debug.logi(new Exception(), "Something to print");
Debug.logw(new Exception(), "Something to print");
Debug.loge(new Exception(), "Something to print");

참고로 Debug 클래스 내에서 new Exception()을 생성하면 Logcat에 Debug 클래스가 TAG로 출력됩니다. 

 

 

 

출처 : http://www.florentio.com/android/logcat%EC%97%90-%EC%A4%84-%EB%B2%88%ED%98%B8-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0/

728x90
반응형
LIST
728x90
반응형
SMALL
 
============================== c# server ==============================
 
서버소켓을 생성하고 안드로이드 에뮬레이터에서 보내오는 스트림 데이터를 설정된 경로에 FileStream클래스를 이용하여 저장한다. 전송이 완료되면 파일 스트림을 닫는다.  
SpiltFileNameBuf는 파일 명을 필터링 하는 함수이다.
 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 
using System.IO; 
  
namespace SocketServer 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Parse("192.168.34.52"),  
10200); 
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream,  
ProtocolType.Tcp); 
            sock.Bind(ipendpoint); 
            sock.Listen(5); 
            Console.WriteLine("서버 작동중!!"); 
            while(true) 
            { 
                Socket Handler = sock.Accept(); 
                MySocketDoit msdo = new MySocketDoit(Handler); 
            } 
        } 
    } 
  
    class MySocketDoit 
    { 
        Socket dosock; 
        byte[] bytes = new byte[1024]; 
        public MySocketDoit(Socket sock) 
        { 
            dosock = sock; 
            Thread th = new Thread(new ThreadStart(DoWork)); 
            th.Start(); 
        } 
        public void DoWork() 
        { 
            int byteRcv = dosock.Receive(bytes); 
            string recvbuf = Encoding.UTF8.GetString(bytes, 0, byteRcv); 
  
            string path = string.Format("C:\\down\\{0}", SpiltFileNameBuf(recvbuf)); 
           FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write); 
            int RcvFile; 
            while (true) 
            { 
                RcvFile = dosock.Receive(bytes); 
                if (RcvFile > 0) 
                { 
                    fs.Write(bytes, 0, RcvFile); 
                } 
                else 
                { 
                    fs.Close(); 
                    Console.WriteLine("전송 완료!!"); 
                    break; 
                } 
            } 
            dosock.Shutdown(SocketShutdown.Both); 
            dosock.Close(); 
        } 
  
        private string SpiltFileNameBuf(string recvbuf) 
        { 
            string fname = string.Empty; 
            int cnt =0; 
            while(recvbuf[cnt] != '\n') 
            { 
                fname += recvbuf[cnt]; 
                cnt++; 
            } 
            return fname; 
        } 
    } 
}
 
============================== Android ==============================
TCPClient.java 
 
소켓을 생성하고 안드로이드 에뮬레이터의 sdcard에 있는 사진 파일을 검색해서 DataOutputStream 클래스로 패킷화 하여 소켓으로 전송한다.
 
import java.io.BufferedWriter; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
  
public class TCPClient implements Runnable{ 
private static final String serverIP="192.168.34.52"; 
private static final int serverPort = 10200; 
private String msg; 
public TCPClient(String msg){ 
            super(); 
            this.msg = msg; 
@Override 
public void run(){ 
try{ 
                InetAddress serverAddr = InetAddress.getByName(serverIP); 
                Socket sock = new Socket(serverAddr, serverPort); 
                try{ 
                    PrintWriter out = new PrintWriter(new BufferedWriter(new  
OutputStreamWriter(sock.getOutputStream())), true); 
                    out.println(msg); 
                    out.flush(); 
                                                  
                    DataInputStream dis = new DataInputStream(new  
FileInputStream(new File("/mnt/sdcard/"+msg+".jpg"))); 
                    DataOutputStream dos = new  
DataOutputStream(sock.getOutputStream()); 
                    byte[] buf = new byte[1024];  
                    while(dis.read(buf)>0) 
                    { 
                            dos.write(buf); 
                            dos.flush(); 
                    } 
                    dos.close(); 
                } 
                catch(Exception e){ 
                    e.printStackTrace();              
                } 
                finally 
                { 
                    sock.close(); 
                } 
catch(Exception e){ 
             e.printStackTrace(); 
}
 
Sock.java 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
  
public class Sock extends Activity { 
    private EditText myet; 
    private TextView mytv; 
    private Button mybtn; 
    public String remsg; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        myet = (EditText)findViewById(R.id.edit); 
        mytv = (TextView)findViewById(R.id.text); 
        mybtn = (Button)findViewById(R.id.sendbtn); 
        mybtn.setOnClickListener(new OnClickListener(){ 
            @Override 
                       public void onClick(View v){ 
                          if((mybtn.getText().toString() != null)&& 
(!mybtn.getText().toString().equals(""))){ 
                   TCPClient tp = new TCPClient(myet.getText().toString()); 
                   tp.run(); 
                                              
                   mytv.setText(myet.getText().toString()); 
                   myet.setText(""); 
                } 
            } 
        }); 
    } 
}
728x90
반응형
LIST

'개발' 카테고리의 다른 글

[svn] Item is out of date  (1) 2024.11.06
[ios] uitextfield의 자동완성 기능 제거하기  (0) 2024.11.06
공인인증기관 CRL DP 주소  (0) 2024.11.04
VMware Workstation unrecoverable error:(vmui)  (0) 2024.11.03
ora-01261 and ora-01262  (0) 2024.11.02

+ Recent posts