달력

72025  이전 다음

  • 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

 앞선 글에서 SrufaceVeiw를 스크린샷 찍는 방법을 알아봤지만, 이렇게해도 안찍히는 경우가 있다면, adb를 이용하는 방법으로 root 계정을 이용한 스크린샷을 찍는 방법을 이용할 수 있다. 

 다만 이 방법의 경우 해당 폰이 루팅이 되어있어야한다.


폰을 루팅하고 su 권한을 얻은 상태라면, 다음 라이브러리를 이용해서 코드한줄로 스크린샷이 가능하다.


https://github.com/Android-ScreenShot/AndroidScreenShotService


해당 깃허브에서 AndroidScreenCap.jar 을 다운받아 자신의 프로젝트에 넣고, 스크린샷을 필요로 하는 곳에서


publice void screenCapture(){

ScreentShotUtil ss = ScreentShotUtil.getInstance();

ss.takeScreenshot(Context, FullPath);

}


이렇게 호출하면 된다. FullPath에는 파일명까지 넣어줘야한다.

(ex : environment.getexternalstoragedirectory().getpath() + "/폴더명/"+System.currentTimeMillis()+".png")


주의 : 경로를 잘못설정하면 파일이 생성되지 않는다. 혹시나 파일이 생성되지 않으면 경로가 제대로 지정되어있는지 확인해 보자.

'android' 카테고리의 다른 글

[android] Screenshot 기능 넣기  (0) 2016.01.31
[android] switch vs if else  (0) 2015.01.29
[android]다른 프로젝트의 Activity 불러오기  (0) 2015.01.29
[android]URL ImageView 생성  (0) 2015.01.27
[android]AlertDialog ListView 예제  (0) 2015.01.20
Posted by 초코렛과자
|

android에서 스크린샷은 스크린샷을 찍고자하는 activity를 불러와서 이를 bitmap 형식으로 변환, 원하는 포멧으로 저장하는 방법을 사용한다. 하지만 현재, 별도의 Camera device에서 android 폰으로 영상을 실시간으로 전송해서(byte arrary 형식) 폰으로는 볼 수 있는데, 해당 activity를 스크린샷 코드를통해 찍으면 검정색 화면만 나온다!


 public void screenshot() { 
  View view = MyActivity.this.getWindow().getDecorView();

  view.setDrawingCacheEnabled(true);

  Bitmap screenshot = view.getDrawingCache();

  String filename = "screenshot.png";

  try {

  File file = new File(Environment.getExternalStorageDirectory(), filename);

//  File file = new File(Environment.getExternalStorageDirectory()+"/추가경로/", filename);

  f.createNewFile();

  OutputStream outStream = new FileOutputStream(f);

  screenshot.compress(Bitmap.CompressFormat.PNG, 100, outStream);

  outStream.close();

  } catch (IOException e) {

  e.printStackTrace();

  }

  view.setDrawingCacheEnabled(false);

  }

}


뭐가 문제인지 찾아봐야겠다.

Posted by 초코렛과자
|

sdk 일정 버전 이상에서는 switch 문을 사용하면 오류가 난다.

이럴경우 전부 if else 문으로 바꾸어 주어야 함.

Posted by 초코렛과자
|

A라는 App에서 B라는 App를 실행하고 싶을 때 사용하는 예제


A.java


Intent intent = new Intent();

intent.setClassName("com.example", "com.example.MainActivity");

startActivity(intent);


com.example에는 B프로젝트의 MainActivity가 있는 package 명을.

com.example.MainActivity 에는 MainActivity까지의 입력하면 된다.


여기에 값을 넘기고 싶으면, intent.putextra("key", "value"); 를 통해서

이건 일반적인 intent에서 값을 넘기는 것과 같다.

'android' 카테고리의 다른 글

[android] Screenshot 기능 넣기  (0) 2016.01.31
[android] switch vs if else  (0) 2015.01.29
[android]URL ImageView 생성  (0) 2015.01.27
[android]AlertDialog ListView 예제  (0) 2015.01.20
[android]URL을 통한 Image 받아오기  (0) 2015.01.19
Posted by 초코렛과자
|
이상하게 구글링을 통해 얻은 많은 예제들이 동작하지 않아, AsynckTask를 통한 URL ImageView를 구현하였다.
MainActivity.java

public class MainActivity extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
new DownloadImageTask((ImageView) findViewById(R.id.img_test)).execute("URL");
}

}


DownloadImageTask.java

public class DownloadImageTask extends AsyncTask {

	ImageView bmImage;

	public DownloadImageTask(ImageView bmImage) {
		this.bmImage = bmImage;
	}

	@Override
	protected Bitmap doInBackground(String... urls) {
		String urlDisplay = urls[0];
		Log.e("hong", "urls : " + urls[0]);
		Bitmap mIcon11 = null;
		try {
			InputStream in = new java.net.URL(urlDisplay).openStream();
			mIcon11 = BitmapFactory.decodeStream(in);
		} catch (Exception e) {
			Log.e("hong", "error : " + e.getMessage());
			e.printStackTrace();
		}
		return mIcon11;
	}

	@Override
	protected void onPostExecute(Bitmap result) {
		bmImage.setImageBitmap(result);
	}

}
이렇게하니 되더라!
Posted by 초코렛과자
|

안드로이드에서 AlertDialog에 ListView를 띄우는 예제 

참고 블로그 - http://yuihorie1004.tistory.com/8



1. String.xml 


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

<resources>


    <string name="app_name">ListViewDialog</string>

    <string name="hello">ListView Test</string>

    <string name="action_settings">Settings</string>


    <!-- ListDialog를 위한 string -->

<string name="list_dialog_title">선택하세요..</string>

<string-array name="list_dialog_list_item">

<item>item select one...</item>

<item>item select two...</item>

<item>item select three...</item>

<item>item select four...</item>

</string-array>

    

</resources>


2. main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/LinearLayout1"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context="com.example.listviewdialog.MainActivity" >


    <TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello" />

    

<Button android:id="@+id/btn_list_dialog"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="Button List Dialog">

</Button>

    


</LinearLayout>


3. MainActivity.java

package com.example.listviewdialog;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;


public class MainActivity extends Activity implements OnClickListener{

private static final String TAG = "hong";
private Button mBtnListDialog;
private ListViewDialog mDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViews();
    }

private void findViews() {
mBtnListDialog = (Button)findViewById(R.id.btn_list_dialog);
mBtnListDialog.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_list_dialog:
Log.d(TAG, "click button list dialg...");
showListDialog();
break;

default:
break;
}
}

private void showListDialog() {
String[] item = getResources().getStringArray(R.array.list_dialog_list_item);
//array를 ArrayList로 변경하는 방법
List<String> listitem = Arrays.asList(item);
ArrayList<String> itemArrayList = new ArrayList<String>(listitem);
mDialog = new ListViewDialog(this, getString(R.string.list_dialog_title), itemArrayList);
mDialog.onOnSetItemClickListener(new ListViewDialogSelectListener() {
@Override
public void onSetOnItemClickListener(int position) {
if(position == 0){
Log.d(TAG, "first index selected");
}
mDialog.dismiss();
}
});
mDialog.show();
}
}

DB에서 값을 받아 ArrayList에 저장 한 후 showListDialog를 호출하면서 넘겨주는 방법으로 itemArrayList를 구성할 수 도 있다. 그렇게 되면 

String[] item = getResources().getStringArray(R.array.list_dialog_list_item);
List<String> listitem = Arrays.asList(item);

이 두줄의 코드는 없어져도 된다.

4. ListViewDialog.java

package com.example.listviewdialog;

import java.util.ArrayList;

import android.app.Dialog;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class ListViewDialog extends Dialog{

private static final String TAG = "hong";
private ListViewDialogSelectListener mListener;
private Context mContext;
private ArrayList<String> mStrListItem;
private ListView mListView;
public ListViewDialog(Context context, String title, ArrayList<String> item) {
super(context);
setContentView(R.layout.list_view_dialog);
mContext = context;
findViews();
setTitle(title);
mStrListItem = item;
createListViewDialog();
}
private void createListViewDialog() {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1, mStrListItem);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Log.d(TAG, "list index = [" + arg2 + "]");
mListener.onSetOnItemClickListener(arg2);
}
});
}

private void findViews() {
mListView = (ListView) findViewById(R.id.list_view_dialog);
}

public void onOnSetItemClickListener(ListViewDialogSelectListener listener) {
mListener = listener;
}

}

5. ListViewDialogSelectListener.java

package com.example.listviewdialog;

public interface ListViewDialogSelectListener {

public void onSetOnItemClickListener(int position);
}


Posted by 초코렛과자
|

MainActivity 부분


onCreate(){

String URL = "이미지주소";

new DownloadImageTask((ImageView)findViewById(R.id.imageView)).execute(URL);

}


DownloadImageTask.java 부분



public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {


ImageView bmImage;

public DownloadImageTask(ImageView bmImage) {

this.bmImage = bmImage;

}

@Override

protected Bitmap doInBackground(String... urls) {

String urlDisplay = urls[0];

Bitmap mIcon11 = null;

try{

InputStream in = new java.net.URL(urlDisplay).openStream();

mIcon11 = BitmapFactory.decodeStream(in);

}catch (Exception e){

Log.e("hong", "error : " + e.getMessage());

e.printStackTrace();

}

return mIcon11;

}


@Override

protected void onPostExecute(Bitmap result) {

bmImage.setImageBitmap(result);

}

}

'android' 카테고리의 다른 글

[android]URL ImageView 생성  (0) 2015.01.27
[android]AlertDialog ListView 예제  (0) 2015.01.20
[android]Test 공부중5. MOCK 객체  (0) 2015.01.12
[android]Test 공부중4.  (0) 2015.01.07
[android]Task 관련 공부중1  (0) 2015.01.07
Posted by 초코렛과자
|

1. SDk는 android.test.mock의 서브패키지로 여러 클래스를 제공한다.


2. MockContext

- 모든 매서드가 UnsupportedOperationException만 던지고 아무 동작 하지 않도록 구현되어 있다.

- 따라서, 이 클랙스를 확장해서 사용하면 테스트에 필요한 메서드의 구현을 잊었다 하더라도 예의가 던져길 것이고 이 상황을 바로 파악할 수 있다(?)

- 즉 이 클래스는 테스트할 클래스에 의존성을 주입하거나 목 또는 모니터로 사용 할 수 있다. 즉 이 클래스를 확장해서 더 높은 수준의 제어가 가능하다(?)

  

3. IsolatedContext

- 테스트를작성하다 보면 주변 컴포넌트와 상호작용을 막아서 액티비티를 격리시켜야 할 필요가 생긴다.0

- 완전히 격리시킬 수 있지만 때로는 액티비티가 제대로 동작하기 위해 꼭필요한 컴포넌트와의 상호작용도 막히는 경우가 생긴다.

- 이를 위해 안드로이드 SDK는 android.test.IsolaedContext를 제공한다

- 이 목 Context는 시스템 대부분과의 상호작용은 막지만 Services나 ContenetProviders처럼 꼭 필요한 컴포넌트와의 상호작용은 막지 않는다.


4. 파일과 데이터베이스 연산의 대안

- 테스트 하는 동안 실제 파일에 영향을 주지 않기 위해서

- android.test.RenamingDelegatingContext


5. MockContentResolver

- 실제내용과 테스트를 격리시키기 위해서 사용


'android' 카테고리의 다른 글

[android]AlertDialog ListView 예제  (0) 2015.01.20
[android]URL을 통한 Image 받아오기  (0) 2015.01.19
[android]Test 공부중4.  (0) 2015.01.07
[android]Task 관련 공부중1  (0) 2015.01.07
[android]Test 공부중3.  (0) 2015.01.06
Posted by 초코렛과자
|

단언문


1. Assertion(단언)이란?

- 판단할 수 있는 특정 상태를 평가해서 기대한 상태와 일치하지 않으면 테스트를 중단하고 예외를 던지는 메서드


2. JUni API에는 모든 테스트 케이스의 부모클래스인 Assert 클래스가 있다.


3. 테스트 하는 도중에 단언문 하나가 실패하면 AssertionFailedException이 던져진다.


4. fail() 메서드를 활용해서 메소드가 예외를 잘 던지는지 확인 할 수 있다.

public void testShouldThrowException{

try{

MainActivity.methodThatShouldThrowException();

fail("Exception was not thrown");

}catch(Exception ex){

//아무 동작 안함

}

}


5. 사용자 정의 메시지 

- 모든 assert 메서드는 String 타입의 사용자 정의 메시지를 사용 할 수 있다.

- 사용자 정의 메시지를 사용하면, 테스트 실패시 기본 메시지 대신 출력되지 때문에 테스트 결과에서 실패 내용

파악이 용이해 진다.

public void testMax(){

final int a = 1;

final int b = 2;

final int expected = b;

final int actual = Math.max(a,b);

assertEquals("Expection " + expected + "but was " + actual, expected, actual);

}


6. Static import

import static android.test.ViewAsserts.해당함수;


7. 뷰 단언문

- 보통 한드로이드 UI를 테스트하기 위해서는 뷰와 관련됨 더 전문적인 메서드가 필요

- 안드로이드는 이를 위해 뷰의 정적 또는 상대적 위치와 뷰와의 관계를 테스트 할 수 있는

android.test.ViewAsserts 클래스를 제공.


8. 추가적인 단언문 MoreAssserts 클래스

- @UiThreadTest 어노테이션 사용


9. TouchUtils 클래스

- 터치이벤트를 간편하게 생성 할 수 있게 도와줌


                                     

'android' 카테고리의 다른 글

[android]URL을 통한 Image 받아오기  (0) 2015.01.19
[android]Test 공부중5. MOCK 객체  (0) 2015.01.12
[android]Task 관련 공부중1  (0) 2015.01.07
[android]Test 공부중3.  (0) 2015.01.06
[android]Test 공부중2.  (0) 2015.01.06
Posted by 초코렛과자
|

Task : 다른 패키지의 컴포넌트까지 포함하여 같은 목적으로 실행되는 컴포넌트의 그룹


1. 태스크는 동일 목적을 위한 액티비티 집합을 하나의 잡업으로 묶음으로써 사용자에게 통합된 경험을 제공한다.


2. 태스크는 실행되는 액티비의 순서를 기억하기 위해 액티비티 스택을 유지한다.


3. 스택 관리 정책에 영향을 미치는 요소는 두 가지가 있는데, 하나는 호출하는 쪽에서 지정하는 것이고, 하나는 호출을 당하는 쪽에서 지정하는 것이다.(상당히 고급기법이라고 한다. 두 속성 조합 시, 결과가 미세하게 다르다고 함. 연구해 볼 필요가 있음)

- 매니페스트의 액티비티 속성을 조정하여 액티비티의 실행 위치나 회수를 제어한다.

- 액티비티를 실행하는 인텐트의 플래그를 통해 액티비티의 동작을 제어한다.


4. 교차생성


5. LaunchMode

- standard : 디폴트 런치모드. 여러 번 생성 될 수 있으며, 스택의 어느 곳에나 놓일 수 있다. 호출 할 때마다 새로운 인스턴스가 현재 태스크의 스택 위쪽에 새로 생성.

- singleTop : standard와 같은 속성. 하지만 스택의 최상위에 있을 때는 새로 생성되지 않으며, 기존 인스턴스가 onNewIntent 메서드로 새 인텐트를 받느다.

- singleTask : 항상 새로운 태스크를 시작하며, 스택의 루트에만 놓인다. 여러개의 인스턴스를 생성하지 않으며, 스택의 위쪽에 놓일 수 없다. 다른 액티비티를 호충하여 스택 위쪽에 생성 할 수 있다.

- singleInstance : singleTask와 같지만, 다른 액티비티를 스택 위쪽에 생성하지 않는다. 어떤 액티비티든지 항상 새로운 태스크가 생성된다.


6. 액티비티 제거 방법

- 일반적으로 finish()를 호출하거나, back 키를 누르면 자동으로 종료

- alwaysRetainTaskState : 시간이 오래 지나도 스택의 모든 액티비티를 유지. 루트 액티비티에 대해 이속성을 지정

- clearTaskOnLaunch : 시간과 상관없이 재시작 할 때마다 루트만 빼고 나머지를 모두 종료한다. 루트에만 이 속성을 지정

- finishOnTaskLaunch : 재시작 할 때 이 액ㅌ이비티를 자동으로 제거. 개별액티비티에 지정 가능.


7. 인텐트의 플래그

- FLAG_ACTIVITY_NEW_TASK : 새로운 태스크를 시작한다.

- FLAG_ACTIVITY_SINGLE_TOP : 스택의 제일 위에 있으면 다시 생성하지 않는다.

- FLAG_ACTIVITY_CLEAR_TOP : 액티비티가 스택에 있다면, 위쪽의 모든 액티비티를 제거하고 새로 생성한다.

(이 외에도 다른 플레그가 많은 것 같지만, 책에 언급되지 않았으므로, 필요할 때 마다 찾아 쓰는걸로...)

'android' 카테고리의 다른 글

[android]Test 공부중5. MOCK 객체  (0) 2015.01.12
[android]Test 공부중4.  (0) 2015.01.07
[android]Test 공부중3.  (0) 2015.01.06
[android]Test 공부중2.  (0) 2015.01.06
[android]Test 공부중.  (0) 2015.01.06
Posted by 초코렛과자
|