2015-01-19 1 views
0

나는 안드로이드를 처음 사용하고 있습니다. &을 받기 위해 앱을 만들고 싶습니다. 내 앱에서 이메일을 읽었습니다. & 일부 블로그를 통해 내 코드를 준비했습니다.안드로이드에서 이메일을 받거나 읽는다.

Retrieving all unread emails using javamail with POP3 protocol

https://buddhimawijeweera.wordpress.com/2011/02/09/sendreceiveemailsjava/

https://metoojava.wordpress.com/2010/03/21/java-code-to-receive-mail-using-javamailapi/

나는 2 주 동안 거의 일하고있다,하지만 여전히 응용 프로그램은 수신 emails.Please이 다른 사람을 errors.Or을 발견하는 데 도움이 표시되지 않습니다 Gmail 앱과 내 앱을 연결하여 이메일을 수신하는 코드를 알고 계십니까? 응용 프로그램에 대한 귀하의 모든 도움을 크게 주시면 감사하겠습니다.

MailReaderActivity.java (주요 활동)

public class MailReaderActivity extends Activity{ 

    Folder inbox; 


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

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 


    } 

    public MailReaderActivity(){ 

     Properties props = System.getProperties(); 
     props.setProperty("mail.store.protocol", "imaps"); 
     try { 

      Session session = Session.getDefaultInstance(props, null); 
      Store store; 
      store = session.getStore("imaps"); 
      store.connect("imap.gmail.com","<[email protected]>","<password>"); 

      inbox = store.getFolder("Inbox"); 
      System.out.println("No of Unread Messages : " + inbox.getUnreadMessageCount()); 

      inbox.open(Folder.READ_ONLY); 

      Message messages[] = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false)); 

      FetchProfile fp = new FetchProfile(); 
      fp.add(FetchProfile.Item.ENVELOPE); 
      fp.add(FetchProfile.Item.CONTENT_INFO); 
      inbox.fetch(messages, fp); 

      try { 
       printAllMessages(messages); 
       inbox.close(true); 
       store.close(); 
      } catch (Exception ex) { 
       System.out.println("Exception arise at the time of read mail"); 
       ex.printStackTrace(); 
      } 
     } catch (NoSuchProviderException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
      System.exit(2); 
     } 
    } 


    public void printAllMessages(Message[] msgs) throws Exception 
    { 
     for (int i = 0; i < msgs.length; i++) 
     { 
      System.out.println("MESSAGE #" + (i + 1) + ":"); 
      printEnvelope(msgs[i]); 
     } 
    } 
    public void printEnvelope(Message message) throws Exception 
    { 
     Address[] a; 
     // FROM 
     if ((a = message.getFrom()) != null) 
     { 
      for (int j = 0; j < 2; j++) 
      { 
       System.out.println("FROM: " + a[j].toString()); 
      } 
     } 
     // TO 
     if ((a = message.getRecipients(Message.RecipientType.TO)) != null) 
     { 
      for (int j = 0; j < 2; j++) 
      { 
       System.out.println("TO: " + a[j].toString()); 
      } 
     } 
     String subject = message.getSubject(); 
     Date receivedDate = message.getReceivedDate(); 
     String content = message.getContent().toString(); 
     System.out.println("Subject : " + subject); 
     System.out.println("Received Date : " + receivedDate.toString()); 
     System.out.println("Content : " + content); 
     getContent(message); 
    } 

    public void getContent(Message msg) 
    { 
     try 
     { 
      String contentType = msg.getContentType(); 
      System.out.println("Content Type : " + contentType); 
      Multipart mp = (Multipart) msg.getContent(); 
      int count = mp.getCount(); 
      for (int i = 0; i < count; i++) 
      { 
       dumpPart(mp.getBodyPart(i)); 
      } 
     } 
     catch (Exception ex) 
     { 
      System.out.println("Exception arise at get Content"); 
      ex.printStackTrace(); 
     } 
    } 

    public void dumpPart(Part p) throws Exception 
    { 
     // Dump input stream .. 
     InputStream is = p.getInputStream(); 
     // If "is" is not already buffered, wrap a BufferedInputStream 
     // around it. 
     if (!(is instanceof BufferedInputStream)) 
     { 
      is = new BufferedInputStream(is); 
     } 
     int c; 
     System.out.println("Message : "); 
     while ((c = is.read()) != -1) 
     { 
      System.out.write(c); 
     } 
    } 

    public static void main(String args[]) 
    { 
     new MailReaderActivity(); 
    } 
} 

Manifest.xml

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

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


<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MailReaderActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

Logcat 

//01-19 13:09:00.554 8487-8487/com.example.dell.frfr E/Trace﹕ error opening trace file: No such file or directory (2) 
01-19 13:09:00.812 8487-8487/com.example.dell.frfr E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.dell.frfr/com.example.dell.frfr.MailReaderActivity}: android.os.NetworkOnMainThreadException 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2277) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2403) 
at android.app.ActivityThread.access$600(ActivityThread.java:165) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373) 
at android.os.Handler.dispatchMessage(Handler.java:107) 
at android.os.Looper.loop(Looper.java:194) 
at android.app.ActivityThread.main(ActivityThread.java:5370) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.os.NetworkOnMainThreadException 
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128) 
      at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
      at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
      at java.net.InetAddress.getByName(InetAddress.java:289) 
      at java.net.InetSocketAddress.<init>(InetSocketAddress.java:105) 
      at java.net.InetSocketAddress.<init>(InetSocketAddress.java:90) 
      at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:321) 
      at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:237) 
      at com.sun.mail.iap.Protocol.<init>(Protocol.java:116) 
      at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:115) 
      at com.sun.mail.imap.IMAPStore.newIMAPProtocol(IMAPStore.java:685) 
      at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:636) 
      at javax.mail.Service.connect(Service.java:295) 
      at javax.mail.Service.connect(Service.java:176) 
      at com.example.dell.frfr.MailReaderActivity.<init>(MailReaderActivity.java:53) 
      at java.lang.Class.newInstanceImpl(Native Method) 
      at java.lang.Class.newInstance(Class.java:1319) 
      at android.app.Instrumentation.newActivity(Instrumentation.java:1123) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2403) 
            at android.app.ActivityThread.access$600(ActivityThread.java:165) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373) 
            at android.os.Handler.dispatchMessage(Handler.java:107) 
            at android.os.Looper.loop(Looper.java:194) 
            at android.app.ActivityThread.main(ActivityThread.java:5370) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:525) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
            at dalvik.system.NativeStart.main(Native Method) 
// 
+0

당신이 게시하시기 바랍니다 수 UR logcat? –

+0

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder(). permitAll(). build(); StrictMode.setThreadPolicy (policy); <- 생성자의 내용을 호출하기 전에 호출해야합니다. 위의 두 줄 뒤에 생성자의 내용을 추가해보십시오. onCreate() 메서드 – Malintha

+0

도움을 주셔서 감사합니다. "NetworkOnMailThread"예외는 아직 표시되지 않습니다. 그러나 여전히 메시지는 표시되지 않습니다. 디버그 출력은 아래와 같습니다. DEBUG IMAPS : 호스트 "imap.gmail.com", 포트 993에 isSSL true로 연결하려고합니다. 문제는 계정에 연결하는 것으로 가정합니다. 코드에서 변경해야 할 사항이 있습니까? – Iyani

답변

0

이 오류를 이미 수정했는지 여부는 알 수 없지만 여전히 문제가있는 사람들에게 도움이 될 수 있습니다.

귀하의 LogCat. 그것은 말합니다 Caused by: android.os.NetworkOnMainThreadException 안드로이드는 기본적으로 응용 프로그램의 나머지 부분과 같은 스레드에서 어떤 네트워킹도 허용하지 않습니다. 그래서 우리는 단지 그것을 실행하는 새 스레드를 생성해야이 문제를 해결하려면

교체합니다. 이것에

public static void main(String args[]) 
    { 
     new MailReaderActivity(); 
    } 

:

public static void main(String args[]) 
{ 
    Thread thread = new Thread() { 
     @Override 
     public void run() { 
      new MailReaderActivity(); 
     } 
    }; 

    thread.start(); 
} 
관련 문제