달력

122025  이전 다음

  • 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 초코렛과자
|

[openCV] image resize

c++ 2016. 1. 13. 21:17

 IpImage 로 생성된 image가 너무 커서, 이걸 cv::Mat 형태로 바꿔서 resize를 하고 다시 IpImage에 할당을 했다.


그리고 다음에 들어오는 이미지 또한, 처음 집어넣은 이미지와 같이 사이즈가 커서 앞선 방식과 마찬가지로 resize를 했다.


그리고 두 이미지를 비교하려고 했더니, 첫번째 IpImage에 두번째 이미지가 들어가있다??????(결국 같은 사진을 비교했다)

이미지를 resize 하는 부분만 주석 처리를 하고 코드를 실행시키면 문제없이 잘 돌아가는데, resize만 하면 마지막에 들어오는 이미지로 IpImage 변수들이 다 바뀐다(?)


ex) IpImage *src, *dest, *temp; 이렇게 3개가 있고 src와 dest와 temp에 각각 다른 이미지를 넣고 비교를 하면 잘 비교가 되는데, 이를 resize 시키고 비교를 하면 src와 dest와 temp에 같은 이미지가 할당된다.


분명 코드를 잘 못 짠거겠지. 아 역시 C는 어렵다.




'c++' 카테고리의 다른 글

android c++ socket file transfer  (0) 2016.01.08
java server c++ client socket 통신 관련 문제  (0) 2016.01.06
Posted by 초코렛과자
|

앞선 글에 대한 해답은 역시 구글에서 찾았다. 그동안 코딩했던 내용과 크게 다르지 않은데, 놓치고 있던 부분이 있었던 것 같다. 


참고사이트 http://www.progtown.com/topic1077981-unsolved-outer-object.html


main.cpp

#include "wcomm.h"
#include <string>
#include "winsock2.h"
#include <clocale>
#define QUIT 9
#define IP "127.0.0.1"
using namespace std;
void runclient (char *ip);
void runserver ();
WComm w;
#include <gdiplus.h>
#pragma comment (lib, "GdiPlus.lib")/* our distressful lib-file */
using namespace Gdiplus;/* as you want, but to me not to a high permanently to write Gdiplus:: */
//7bdc1c72-01bb-4802-9998-6a5cb402006b
static const GUID bmp =//{0x7bdc1c72, 0x01bb, 0x4802, {0x99,0x98,0x6a, 0x5c, 0xb4,0x02,0x00,0x6b}};
{0x557cf406, 0x1a04, 0x11d3, {0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}};
void runclient (char *ip);
void runserver ();
char SCREENPATH [50] = "c: \\screen \\screen.bmp";
#define SCREENPATHL L "c: \\screen \\screen.bmp"
void createscreen ()
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup (&gdiplusToken, &gdiplusStartupInput, NULL);
HDC scrdc, memdc;
HBITMAP membit;
scrdc = GetDC (0);
int Height, Width;
Height = GetSystemMetrics (SM_CYSCREEN);
Width = GetSystemMetrics (SM_CXSCREEN);
memdc = CreateCompatibleDC (scrdc);
membit = CreateCompatibleBitmap (scrdc, Width, Height);
SelectObject (memdc, membit);
BitBlt (memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
HBITMAP hBitmap;
hBitmap = (HBITMAP) SelectObject (memdc, membit);
Gdiplus:: Bitmap bitmap (hBitmap, NULL);
bitmap. Save (SCREENPATHL, &bmp);
DeleteObject (hBitmap);
}
void main (/*int argc, char *argv [] */)
{
setlocale (LC_ALL, "rus");
int t, quit, i;
char s [1024], s1 [1024];
cout <<"type:\n1-run server\n2-run client" <<endl;
cin>> t;
strcpy (s, IP);
if (t == 1)
runserver ();
else
{
runclient (s);
}
}
void runserver ()
{
//Start Server Daemon
w.startServer (27015);
printf ("Server Started........\n");
while (TRUE)
{
//Wait until a client connects
w.waitForClient ();
printf ("Client Connected......\n");
//Work with client
while (TRUE)
{
char rec [50] = "";//it is accepted the data from the client
w.recvData (rec, 32); w.sendData ("OK");//it is sent that accepted
if (strcmp (rec, "FileSend") == 0)
{ 

char fname [32] = "";



wcom.cpp

#include "wcomm.h"
WSADATA wsaData;
SOCKET m_socket;
SOCKET m_backup;
sockaddr_in con;
SOCKET AcceptSocket;
using namespace std;
BOOL GetLastWriteTime (HANDLE hFile, LPTSTR lpszString, DWORD dwSize);
//all
WComm:: WComm ()
{
//Initialize Winsock.
int iResult = WSAStartup (MAKEWORD (2,2), &wsaData);
if (iResult! = NO_ERROR)
printf ("Error at WSAStartup () \n");
//Create a socket.
//AF_INET - the Internet socket
//SOCK_STREAM - a stream socket (with connection setting)
//0 - it is by default selected TCP the protocol
m_socket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET) {
printf ("Error at socket (): %ld\n", WSAGetLastError ());
WSACleanup ();
return;
}
//we copy a socket
m_backup = m_socket;
}
//Good Programmer do not comment this
//WComm:: ~WComm () {WSACleanup ();}
void WComm:: connectServer (char *ip, int port)
{
//Connect to a server.
con.sin_family = AF_INET;
con.sin_addr.s_addr = inet_addr (ip);
con.sin_port = htons (port);
if (connect (m_socket, (SOCKADDR *) &con, sizeof (con)) == SOCKET_ERROR) {
printf ("Failed to connect.\n");
WSACleanup ();
return;
}
}
void WComm:: startServer (int port)
{
//Connect to a server binding of a socket with the local address.
con.sin_family = AF_INET;//
con.sin_addr.s_addr = inet_addr ("0.0.0.0");
con.sin_port = htons (port);
//it is caused bind for binding
if (bind (m_socket, (SOCKADDR *) &con, sizeof (con)) == SOCKET_ERROR) {
printf ("Failed to connect.\n");
WSACleanup ();
return;
}
//Listen on the socket.
if (listen (m_socket, 1) == SOCKET_ERROR)
printf ("Error listening on socket.\n");
}
void WComm:: waitForClient ()
{
AcceptSocket = INVALID_SOCKET;
//we resolve attempt of entering connection on the server
while (AcceptSocket == INVALID_SOCKET) {
AcceptSocket = accept (m_backup, NULL, NULL);
}
m_socket = AcceptSocket;
//a m_socket-new socket
}
int WComm:: sendData (char *sendbuf)
{
return send (m_socket, sendbuf, strlen (sendbuf), 0);
}
int WComm:: recvData (char *recvbuf, int size)
{
int sz = recv (m_socket, recvbuf, size, 0);
recvbuf [sz] = '\0 ';
return sz;
}
void WComm:: closeConnection ()
{
closesocket (m_socket);
m_socket = m_backup;
}
void WComm:: fileReceive (char *filename)
{
char rec [50] = "";
HANDLE hFile;
TCHAR szBuf [MAX_PATH];
string s1;
recv (m_socket, filename, 32, 0);
send (m_socket, "OK", strlen ("OK"), 0);
hFile = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
GetLastWriteTime (hFile, szBuf, MAX_PATH);
CloseHandle (hFile);
FILE *fw = fopen (filename, "wb");
int recs = recv (m_socket, rec, 32, 0);//accepted file size
send (m_socket, "OK", strlen ("OK"), 0);
rec [recs] = '\0 ';
int size = atoi (rec);
while (size> 0)
{
char buffer [1030];
if (size> =1024)
{
recv (m_socket, buffer, 1024, 0);
send (m_socket, "OK", strlen ("OK"), 0);
fwrite (buffer, 1024, 1, fw);
}
else
{
recv (m_socket, buffer, size, 0);
send (m_socket, "OK", strlen ("OK"), 0);
buffer [size] = '\0 ';
fwrite (buffer, size, 1, fw);
}
size - = 1024;
}
char fn [MAX_PATH], fn1 [MAX_PATH];
int i=0;
//strcpy (s, szBuf);
strcpy (fn, filename);
string s_tmp;
for (int i=strlen (filename)-1; fn [i+1]! = '. '; i-)
{
s_tmp=fn [i];
s1.insert (0, s_tmp);
}
s1.resize (s1.length ());
string s2;
for (int i=0; i <MAX_PATH; i ++)
{
s_tmp=szBuf [i];
s2.push_back (szBuf [i]);
}
s2.resize (strlen (szBuf));
string s3;
s3=s2+s1;
fclose (fw);
rename (fn, s3.c_str ());
}
void WComm:: fileSend (char *fpath)
{
//Extract only filename from given path.
char filename [50];
int i=strlen (fpath);
for (; i> 0; i-) if (fpath [i-1] == ' \\') break;
for (int j=0; i <= (int) strlen (fpath); i ++) filename [j ++] =fpath [i];
////////////////////////////////////////
ifstream myFile (fpath, ios:: in|ios:: binary|ios:: ate);
int size = (int) myFile.tellg ();//current position in a flow
myFile.close ();
char filesize [10]; itoa (size, filesize, 10);
send (m_socket, filename, strlen (filename), 0);//we send a name
char rec [32] = ""; recv (m_socket, rec, 32, 0);
send (m_socket, filesize, strlen (filesize), 0);//we send file size
recv (m_socket, rec, 32, 0);//we accept acknowledgement
FILE *fr = fopen (fpath, "rb");
while (size> 0)
{
char buffer [1030];
if (size> =1024)
{
fread (buffer, 1024, 1, fr);
send (m_socket, buffer, 1024, 0);
recv (m_socket, rec, 32, 0);
}
else
{
fread (buffer, size, 1, fr);
buffer [size] = '\0 ';
send (m_socket, buffer, size, 0);
recv (m_socket, rec, 32, 0);
}
size - = 1024;
}
fclose (fr);
}
BOOL GetLastWriteTime (HANDLE hFile, LPTSTR lpszString, DWORD dwSize)
{
FILETIME ftCreate, ftAccess, ftWrite;
SYSTEMTIME stUTC, stLocal;
DWORD dwRet;
//Retrieve the file times for the file.
if (! GetFileTime (hFile, &ftCreate, &ftAccess, &ftWrite))
return FALSE;
//Convert the last-write time to local time.
FileTimeToSystemTime (&ftWrite, &stUTC);
SystemTimeToTzSpecificLocalTime (NULL, &stUTC, &stLocal);
//Build a string showing the date and time.
dwRet = StringCchPrintf (lpszString, dwSize,
TEXT ("%02d- % 02D - % 02D - % 02D - % 02D - % 02d");
stLocal.wDay,stLocal.wMonth,stLocal.wYear;
stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
if (S_OK == dwRet)
return TRUE;
else return FALSE; 

}



wcom.h

#include "winsock2.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <fstream>
#include <tchar.h>
#include <strsafe.h>
#include <string>
#include <cstring>
#include <windows.h>
#ifndef WCOME_H
#define WCOME_H
class WComm
{
public:
WComm ();
void connectServer (char *, int);
int sendData (char *);
int recvData (char *, int);
void fileSend (char *);
void fileReceive (char *);
void startServer (int);
void waitForClient ();
void closeConnection ();
}; 

#endif


'c++' 카테고리의 다른 글

[openCV] image resize  (0) 2016.01.13
java server c++ client socket 통신 관련 문제  (0) 2016.01.06
Posted by 초코렛과자
|

java server 에서 local에 있는 file을 byteArray 로 받아서 c++ client 로 socket 통신을 활용해 보내고 싶은데, 쉽게 되지가 않는다. java server client간 socket 통신은 쉽게 되던데 c++ client 로 보내는건 어느 부분에서 문제가 생긴건지 조차 쉽게 발견되지 않는다. 현재 문제의 원인이라고 생각되는 부분은 다음과 같다.


1. java server 에서는 UTF-8이나 유니코드를 사용하는데, 받는 C++ client 에서는 ASCII 코드를 사용해서 넘겨주는 과정에서 쓰레기 값이 되서 넘어오는경우. 이 경우의 경우 java 쪽에서 형태를 변환해 줘야 할텐데, 시도해 봐야겠다.


2. java server 에서 파일을 File file= new File(경로) 로 불러와서 byte[] byteArr = new byte[(int)file.length] 형태로 받아서 bufferedout.write 와 bufferedin.read 를 통해 넘겨주는데, c++ client에서는 이를 받을 수 있는 형태가 없는 경우. 이 경우는 어떻게 해결해야 될지 모르겠다.


위에서 java server라고 썼지만, 실제로는 android를 server로 하고있다.


현재 하고자 하는 일은 android phone에서 찍은 사진을 c++과 socket을 통해 pc로 떨구고자 하는 일이다. 엄청 쉽다고 생각했는데, 생각보다 쉽게 풀리지 않는다. 


p.s. 혹시 관련 예제나 힌트를 주실 수 있는 분이 있다면 정중하게 댓글을 부탁합니다.


'c++' 카테고리의 다른 글

[openCV] image resize  (0) 2016.01.13
android c++ socket file transfer  (0) 2016.01.08
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 초코렛과자
|

SingleTon만들기

JAVA 2015. 1. 29. 16:48

예전에 SingleTon을 배울때는 이걸 어디다 쓰나 했는데, 이걸 사용하는 일이 생겼다.


생성은 간단하게,


public static final SingleTonClass mSingleton = new SingleTonClass();


protected SingleTonClass(){

}


이렇게 하고 다른 곳에서 불러 쓰면 끝.

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 초코렛과자
|