마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 스튜디오 어플 제작중 Onclick로 이벤트처리를 하지 않고 그냥 실행되게 하고싶은데 방법을 모르겠습니다. ㅠㅠ

0 추천

지금 SMS를 수신하여 발신자,발신시간,내용을 SMS브로드케스트에서 받아와서 Email로 자동전송하는 어플을 제작 하고 있습니다. ㅠㅠ

package com.example.kwak.emailsendtest;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;

public class MainActivity extends AppCompatActivity implements View.OnClickListener  {

    //Declaring EditText
    private EditText editTextEmail;
    private EditText editTextSubject;
    private EditText editTextMessage;
    TextView messageTextView;
    //Send button
    private Button buttonSend;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        messageTextView = (TextView) findViewById(R.id.messageTextView);
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS);
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "SMS 수신 권한 있음.", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "SMS 수신 권한 없음.", Toast.LENGTH_LONG).show();

            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS)) {
                Toast.makeText(this, "SMS 권한 설명 필요함.", Toast.LENGTH_LONG).show();

            } else {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.RECEIVE_SMS},
                        1);

            }
        }
        // 전달된 인텐트를 처리합니다.
        Intent passedIntent = getIntent();
        processIntent(passedIntent);

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();


    }

    /**
     * 이 액티비티가 SINGLE_TOP 플래그로 되어 있으면 이 메소드로 인텐트가 전달됩니다.
     */
    protected void onNewIntent(Intent intent) {
        // 전달된 인텐트를 처리합니다.
        processIntent(intent);

        super.onNewIntent(intent);
    }

    /**
     * 전달된 인텐트를 처리합니다.
     *
     * @param intent
     */
    private void processIntent(Intent intent) {

        if (intent != null) {
            // 발신 번호
            String sender = intent.getStringExtra("sender");
            // 수신 내용
            String contents = intent.getStringExtra("contents");

            // 시간
            String receivedDate = intent.getStringExtra("receivedDate");

            editTextEmail = (EditText) findViewById(R.id.editTextEmail);
            editTextSubject = (EditText) findViewById(R.id.editTextSubject);
            messageTextView = (TextView) findViewById(R.id.messageTextView);

            if (sender != null) {
                messageTextView.setText(sender + "에서 문자수신\n" + "[" + receivedDate + "] \n"  + contents);

            }
        }


        buttonSend = (Button) findViewById(R.id.buttonSend);

        //Adding click listener
        buttonSend.setOnClickListener(this);
    }


    private void sendEmail() {
        //Getting content for email
        String email = editTextEmail.getText().toString().trim();
        String subject = editTextSubject.getText().toString().trim();
        String message = messageTextView.getText().toString().trim();

        //Creating SendMail object
        SendMail sm = new SendMail(this, email, subject, message);

        //Executing sendmail to send email
        sm.execute();
    }




        @Override
        public void onClick(View v) {
        sendEmail();
    }

}



제가 안드로이드 스튜디오를 처음써보고 JAVA기반으로 되어있다보니 JAVA또한 다룬적이 없어서 오픈소스를 활

용하여 소스 해석하여 짜집기식으로 제작 하고있습니다. 컴퓨터전공이 아닌 학부생이다보니 조금 어렵네요 ㅠㅠ

어찌어찌하여 SMS가 수신되면 발신번호,발신시간,SMS내용을 긁어 와서 Email로 전송할 내용 레이아웃에 담

는것까지는 성공하였습니다. 하지만 Email보내는 소스가 마지막에

 

   @Override
        public void onClick(View v) {
        sendEmail();
    }

이부분이 클릭하여 sendEmail을 실행해서 메일이 보내지는거 같은데

클릭안하고 그냥 sendEmail을 실행시키게 하고 싶습니다ㅠㅠ

즉 손이 안가고 SMS가 오면 자동으로 내용과시간발신자를 긁어와서 전송이 되게끔 하고싶습니다ㅠㅠ

여기저기 찾아봤는데 Oncreate로 해서 하라던데 그렇게 해봣는데 오류가 떠서...ㅠㅠ

 

어떻게 해야되는지 좀 가르쳐주세요 ㅠㅠ

두폴이 (180 포인트) 님이 2016년 8월 4일 질문

1개의 답변

0 추천

아마도 메일 보내는것이 네트워크에 연결해서 작업을 처리하는 것이다 보니 OnCreate() 에서 직접적으로 호출하면 안되는것 같습니다.

왜냐하면 앱이 실행되자 마자 네트워크에 연결해서 무슨 작업을 하게 되면 앱이 늦게 뜨거든요.

때문에 구글에서 액티비티가 처음 생성되자 마자 직접적으로 네트워크 호출을 하면 에러가 떨어지게 만들어놨다고 들었습니다.

저도 이것때문에 http 통신 처음에 할때 무지 삽질 했습니다...

방법은 AsyncTask로 스레드 만들어서 백그라운드로 처리하는 것입니다. 비동기나 스레드로 무엇을 처리한다는게 아주 귀찮은 방법이죠... 손이 많이 갑니다;;;

우선 AsyncTask 클래스를 하나 만들어야 합니다.

메인 액티비티 아래쯤에 이메일 전송을 처리하는 AsyncTask 클래스를 하나 만들어 줍니다.

private class EmailAsyncTask extends AsyncTask<String, Void, Boolean> {
    // 비동기 작업 진행
    @Override
    protected Boolean doInBackground(String... params) {

        //Getting content for email
        String email = params[0];
        String subject = params[1];
        String message = params[2];

        //Creating SendMail object
        SendMail sm = new SendMail(this, email, subject, message);

        //Executing sendmail to send email
        sm.execute();

        return true;
    }

    @Override
    protected void onPostExecute(Boolean isCompleted) {
        // 전송 완료 후 작업
    }
}

 

그리고 OnCreate() 에 만든 AsyncTask를 호출합니다.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        messageTextView = (TextView) findViewById(R.id.messageTextView);
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS);
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "SMS 수신 권한 있음.", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "SMS 수신 권한 없음.", Toast.LENGTH_LONG).show();
 
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS)) {
                Toast.makeText(this, "SMS 권한 설명 필요함.", Toast.LENGTH_LONG).show();
 
            } else {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.RECEIVE_SMS},
                        1);
 
            }
        }
        // 전달된 인텐트를 처리합니다.
        Intent passedIntent = getIntent();
        processIntent(passedIntent);
 
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
 
        String email = editTextEmail.getText().toString().trim();
        String subject = editTextSubject.getText().toString().trim();
        String message = messageTextView.getText().toString().trim();
 

        new EmailAsyncTask().execute(email, subject, message);
    }

neoamuro (340 포인트) 님이 2016년 8월 4일 답변
우선 원리에 대해 답변 해주시고 코드까지 도움을 주셔서 정말 감사드립니다.
돌려봣는데  AsyncTask 클래스만들때
SendMail sm = new SendMail(this,email,subject,message);
여기서 this,email,subject,message에 빨간줄 찍 끄이고
마지막
sm.execute();에도 빨간줄이 끄이네요..ㅠㅠ  
타입이 뭔가 안맞는건가...제가 Java는 아예 처음 해보는거라 진짜 힘드네요 .ㅠㅠ
아... 이런.. 죄송합니다...
코드가 테스트가 안되니까... 저렇게 됐네여;;
SendMail의 this가 메인액티비티의 context가 되어야 하겠네요

Async 생성자에서 액티비티의 context를 받을수 있게 바꾸고...
private class EmailAsyncTask extends AsyncTask<String, Void, Boolean> {
    
    Context context;
    
    private EmailAsyncTask(Context context){
        this.context = context;
    }
    // 비동기 작업 진행
    @Override
    protected Boolean doInBackground(String... params) {

        //Getting content for email
        String email = params[0];
        String subject = params[1];
        String message = params[2];

        //Creating SendMail object
        SendMail sm = new SendMail(this.context, email, subject, message);

        //Executing sendmail to send email
        sm.execute();

        return true;
    }

    @Override
    protected void onPostExecute(Boolean isCompleted) {
        // 전송 완료 후 작업
    }
}

async 호출할때 this를 넣어주시면 되지 않을까 싶습니다.
new EmailAsyncTask(this).execute(email, subject, message);
감사합니다!!!!알면간단하고 모르면 어려운거였습니다 ㅠㅠ
...