2013-05-13 65 views

回答

10

非常艰苦的工作后,现在我能够使用OAuth 2.登录到谷歌现在我在这里分享很多问题在这里没有答案。以下步骤需要登录Google。

1-选择从设备使用

public static AccountManager accountManager; 
accountManager = AccountManager.get(this); 
Account[] accounts = accountManager.getAccountsByType("com.google"); 

2-获取令牌从选定帐户使用

private void onAccountSelected(final Account account) { 
accountManager.getAuthToken(account, AUTH_TOKEN_TYPE, null, this, new AccountManagerCallback<Bundle>() { 
    public void run(AccountManagerFuture<Bundle> future) { 
     try { 
      String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN); 
      useToken(account, token); 
     } catch (OperationCanceledException e) { 
      onAccessDenied(); 
     } catch (Exception e) { 
      handleException(e); 
     } 
    } 
}, null); 

一个帐户}

3-现在使用用户帐户和T验证令牌奥肯。你将能够登录到谷歌。

注意:经过一段时间令牌未经授权登录,因此您需要使令牌无效。

4-重新登录,你必须使用无效

accountManager.invalidateAuthToken("com.google", token); 

无效后,你必须得到使用新的凭证您的令牌

String newToken = AccountManager.get(this).getAuthToken(new Account(account,  "com.google"), 
       AUTH_TOKEN_TYPE, true, null, null).getResult().getString(AccountManager.KEY_AUTHTOKEN); 

6-在你的AndroidManifest.xml中添加下面的使用权限

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

这就是所有你需要,现在享受

+0

你能发布完整的工作代码与电子邮件发送部分? – keybee 2013-09-24 13:23:56

+2

您将从[这里](http://code.google.com/p/google-mail-oauth2-tools/wiki/JavaSampleCode)获得完整代码 – IPL10 2013-09-24 14:10:39

+0

@IPL请引导我或分享您的示例代码。在此先感谢:) – 2014-07-15 01:32:27

3
fist you download activation.jar,mail.jar,additionnal.jar and add to built to your project              

And code r following 
---------Create GMailSender.class 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.mail.Message; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.security.Security; 
import java.util.Properties; 

public class GMailSender extends javax.mail.Authenticator { 
    private String mailhost = "smtp.gmail.com"; 
    private String user; 
    private String password; 
    private Session session; 

    static { 
     Security.addProvider(new JSSEProvider()); 
    } 

    public GMailSender(String user, String password) { 
     this.user = user; 
     this.password = password; 

     Properties props = new Properties(); 
     props.setProperty("mail.transport.protocol", "smtp"); 
     props.setProperty("mail.host", mailhost); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.port", "465"); 
     props.put("mail.smtp.socketFactory.port", "465"); 
     props.put("mail.smtp.socketFactory.class", 
       "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.socketFactory.fallback", "false"); 
     props.setProperty("mail.smtp.quitwait", "false"); 

     session = Session.getDefaultInstance(props, this); 
    } 

    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(user, password); 
    } 

    public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception { 
     try{ 
     MimeMessage message = new MimeMessage(session); 
     DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain")); 
     message.setSender(new InternetAddress(sender)); 
     message.setSubject(subject); 
     message.setDataHandler(handler); 
     if (recipients.indexOf(',') > 0) 
      message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients)); 
     else 
      message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients)); 
     Transport.send(message); 
     }catch(Exception e){ 
      e.printStackTrace(); 

     } 
    } 

    public class ByteArrayDataSource implements DataSource { 
     private byte[] data; 
     private String type; 

     public ByteArrayDataSource(byte[] data, String type) { 
      super(); 
      this.data = data; 
      this.type = type; 
     } 

     public ByteArrayDataSource(byte[] data) { 
      super(); 
      this.data = data; 
     } 

     public void setType(String type) { 
      this.type = type; 
     } 

     public String getContentType() { 
      if (type == null) 
       return "application/octet-stream"; 
      else 
       return type; 
     } 

     public InputStream getInputStream() throws IOException { 
      return new ByteArrayInputStream(data); 
     } 

     public String getName() { 
      return "ByteArrayDataSource"; 
     } 

     public OutputStream getOutputStream() throws IOException { 
      throw new IOException("Not Supported"); 
     } 
    } 
} 

2-Create JSSEProvider.class 
import java.security.AccessController; 
import java.security.Provider; 

public final class JSSEProvider extends Provider { 

    public JSSEProvider() { 
     super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); 
     AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() { 
      public Void run() { 
       put("SSLContext.TLS", 
         "org.apache.harmony.xnet.provider.jsse.SSLContextImpl"); 
       put("Alg.Alias.SSLContext.TLSv1", "TLS"); 
       put("KeyManagerFactory.X509", 
         "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl"); 
       put("TrustManagerFactory.X509", 
         "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl"); 
       return null; 
      } 
     }); 
    } 
} 

3-use This code in to your Activity button click etc.. 
try { 
        GMailSender sender = new GMailSender("sender gmail ID", "password"); 
        sender.sendMail("This is Subject", 
          "This is Body", 
          "receiverID", 
          "receiverID"); 
       } catch (Exception e) { 
        Log.e("SendMail", e.getMessage(), e); 
       } 

来源:https://stackoverflow.com/a/2033124/865900(信贷,信贷是由于)

+0

感谢@Brajendra潘迪您的快速答复,但在上面的代码中的needes硬编码的用户ID和密码。但我需要使用AccountManager访问的设备邮件ID和令牌。我不想问用户的邮件ID和密码。 – IPL10 2013-05-13 12:47:31

+0

使用Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); \t \t sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, \t \t \t \t “BP详细信息”); \t \t sharingIntent.putExtra(Intent.EXTRA_STREAM, \t \t \t \t Uri.parse( “文件://” + file.getAbsolutePath())); \t \t context.startActivity(Intent.createChooser(sharingIntent,“Share By”));在android中。 – 2013-05-13 12:53:18

+0

再次感谢我的心底,我想以编程的方式发送邮件,而无需用户在上面的代码中进行交互,每次用户交互时都需要单击发送按钮。 – IPL10 2013-05-13 12:58:46