Facebook(二)使用LoginButton实现授权登录并注销授权信息

一、实现效果

第一次进入应用


点击授权按钮



授权完毕跳转


点击Lou out 退出应用

第二次进入应用



二、关键代码

1.布局文件

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:facebook="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.facebook.widget.LoginButton
        android:id="@+id/login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp" />

</LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/greeting"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="10dp"
        android:text="username"
        android:textColor="#333"
        android:textSize="18sp" />

    <com.facebook.widget.ProfilePictureView
        android:id="@+id/profilePicture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:gravity="center_horizontal" />

    <TextView
        android:id="@+id/other_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="10dp"
        android:text="other info"
        android:textColor="#333"
        android:textSize="18sp" />

    <Button
        android:id="@+id/clicklogout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="log out " />

</LinearLayout>
2.关键类

MyLoginActivity.java

package com.facebook.samples.hellofacebook.example;

import java.util.Arrays;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.facebook.Session;
import com.facebook.Session.AuthorizationRequest;
import com.facebook.SessionState;
import com.facebook.UiLifecycleHelper;
import com.facebook.model.GraphUser;
import com.facebook.samples.hellofacebook.R;
import com.facebook.widget.FacebookDialog;
import com.facebook.widget.LoginButton;

public class MyLoginActivity extends Activity {
	protected static final String TAG = "MyLoginActivity";
	private LoginButton loginButton;
	private GraphUser user;
	private UiLifecycleHelper uiHelper;
	private Session.StatusCallback callback;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);
		callback = new Session.StatusCallback() {
			@Override
			public void call(Session session, SessionState state, Exception exception) {
				if (state.isOpened()) {
					Log.e(TAG, "log in");
				} else {
					Log.e(TAG, "log out ");
				}
				updateUI();
			}
		};
		uiHelper = new UiLifecycleHelper(this, callback);
		loginButton = (LoginButton) findViewById(R.id.login_button);
		loginButton.setReadPermissions(Arrays.asList("user_likes", "user_status"));
		loginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() {
			@Override
			public void onUserInfoFetched(GraphUser user) {
				MyLoginActivity.this.user = user;
				updateUI();
			}
		});
		// 设置授权状态监听
		loginButton.setSessionStatusCallback(callback);
	}

	// 该方法会不断的被调用,因为按钮设置了UserinfoChangedCallback监听回调
	private void updateUI() {
		Session session = Session.getActiveSession();
		// 取得用户信息
		boolean enableButtons = (session != null && session.isOpened());
		if (enableButtons && user != null) {
			Intent intent = new Intent(MyLoginActivity.this, MainActivity.class);
			Bundle bundle = new Bundle();
			bundle.putString("userid", user.getId());
			bundle.putString("username", user.getUsername());
			bundle.putString("otherinfo", "firstname:" + user.getFirstName() + ",lastname:" + user.getLastName() + "JSON:" + user.getInnerJSONObject().toString());
			intent.putExtra("user", bundle);
			startActivity(intent);
			finish();

		} else if (session != null && session.isClosed()) {
			user = null;
		} else {
			return;
		}

	}

	// 授权成功后会调用该方法获得返回的信息
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		uiHelper.onActivityResult(requestCode, resultCode, data, dialogCallback);
	}

	private FacebookDialog.Callback dialogCallback = new FacebookDialog.Callback() {
		@Override
		public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {
			Log.d("HelloFacebook", String.format("Error: %s", error.toString()));
			Toast.makeText(MyLoginActivity.this, "error", 0).show();
		}

		@Override
		public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
			Toast.makeText(MyLoginActivity.this, "success", 0).show();
		}
	};

}

MainActivity.java

package com.facebook.samples.hellofacebook.example;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import com.facebook.Session;
import com.facebook.samples.hellofacebook.R;
import com.facebook.widget.ProfilePictureView;

public class MainActivity extends Activity {
	private ProfilePictureView userimage;
	private TextView username, otherinfo;
	private String useridStr;
	private String usernameStr;
	private String otherinfoStr;
	private Button logout;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		userimage = (ProfilePictureView) this.findViewById(R.id.profilePicture);
		username = (TextView) this.findViewById(R.id.greeting);
		otherinfo = (TextView) this.findViewById(R.id.other_info);

		Intent intent = getIntent();
		Bundle bundle = intent.getBundleExtra("user");
		usernameStr = bundle.getString("username");
		useridStr = bundle.getString("userid");
		otherinfoStr = bundle.getString("otherinfo");

		userimage.setProfileId(useridStr);
		username.setText(usernameStr);
		otherinfo.setText(otherinfoStr);

		logout = (Button) this.findViewById(R.id.clicklogout);
		logout.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				Session.getActiveSession().closeAndClearTokenInformation();
				finish();
			}
		});
	}

}

3.配置文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.facebook.samples.hellofacebook"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="9" />

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

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Light.NoTitleBar" >
        <activity
            android:name="com.facebook.samples.hellofacebook.example.MyLoginActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustResize" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.facebook.samples.hellofacebook.example.MainActivity" >
        </activity>
        <!-- Facebook -->
        <activity
            android:name="com.facebook.LoginActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/app_id2" />

        <provider
            android:name="com.facebook.NativeAppCallContentProvider"
            android:authorities="com.facebook.app.NativeAppCallContentProvider233936543368280"
            android:exported="true" />
    </application>

</manifest>

上面的demo是在Facebook提供的demo的基础上进行简化的,看起来很明了。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
package com.shou.loginfjame; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.SQLException; import java.util.List; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.xml.bind.util.ValidationEventCollector; import com.shou.LoginUtil.LoginUser; import com.shou.dao.LoginDao; import com.shuo.util.ValidCode; public class LoginFjame extends JFrame implements ActionListener { private JFrame frame = new JFrame("登录"); private JPanel panel = new JPanel(); private JLabel tiel = new JLabel("龍丶逸小说登录系统"); // 创建标题 private JLabel userLabel = new JLabel("用户名:"); // 创建UserJLabel private JTextArea userText=new JTextArea("请输入内容",7, 30); // 获取登录名 private JLabel passLabel = new JLabel("密 码:"); // 创建PassJLabel private JPasswordField passText = new JPasswordField(20); // 密码框隐藏 private JLabel verCodeLa = new JLabel("验证码:"); // 验证码 private JTextField inputCode = new JTextField(); // 验证码框 private ValidCode vcode = new ValidCode(); // 验证码内容 JTextField jt_code; private JButton loginButton = new JButton("登录"); // 创建登录按钮 private JButton registerButton = new JButton("注 册"); // 创建注册按钮 private JButton newPasswordButton = new JButton("忘记密码"); // 创建注册按钮 private JButton exitButton = new JButton("退出"); JTextField field = null; public LoginFjame() { System.out.println("====================================="); System.out.println("== 龍丶逸小说系统 =="); System.out.println("== V1.1.1.0 =="); System.out.println("====================================="); WinLogin(); } public void WinLogin() { panel.setLayout(null); // 设置布局为 null // 创建标题名称 this.tiel.setFont(new Font("宋体", 1, 20)); this.tiel.setBounds(150, 30, 300, 25); this.panel.add(this.tiel); // 创建 UserJLabel this.userLabel.setFont(new Font("宋体", 1, 13)); this.userLabel.setBounds(70, 80, 80, 25); this.panel.add(userLabel); // 创建文本域用于用户输入 this.userText.setBounds(145, 80, 165, 25); this.panel.add(this.userText); // 注册 this.registerButton.setFont(new Font("宋体", 1, 15)); this.registerButton.setContentAreaFilled(false); this.registerButton.setBorderPainted(false); /* registerButton.setBackground(Color.red); */ this.registerButton.setBounds(320, 80, 100, 25); this.panel.add(this.registerButton); // 变成小手 this.registerButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // 创建PassJLabel this.passLabel.setFont(new Font("宋体", 1, 13)); this.passLabel.setBounds(70, 110, 80, 25); this.panel.add(this.passLabel); // 密码输入框 隐藏 this.passText.setBounds(145, 110, 165, 25); this.panel.add(this.passText); // 忘记密码 this.newPasswordButton.setFont(new Font("宋体", 1, 15)); this.newPasswordButton.setContentAreaFilled(false); this.newPasswordButton.setBorderPainted(false); /* registerButton.setBackground(Color.red); */ this.newPasswordButton.setBounds(320, 110, 100, 25); this.panel.add(this.newPasswordButton); // 变成小手 this.newPasswordButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // 验证码code this.verCodeLa.setFont(new Font("宋体", 1, 13)); this.verCodeLa.setBounds(70, 140, 80, 25); this.panel.add(this.verCodeLa); // 验证码框 this.inputCode.setBounds(145, 140, 165, 25); this.panel.add(this.inputCode); // 验证码图片 this.vcode.setBounds(320, 140, 165, 25); this.panel.add(this.vcode); System.out.println(this.vcode); // 创建登录按钮 this.loginButton.setFont(new Font("宋体", 1, 15)); this.loginButton.setBounds(95, 190, 80, 25); this.panel.add(this.loginButton); // 变成小手 this.loginButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // 退出按钮 this.exitButton.setFont(new Font("宋体", 1, 15)); this.exitButton.setBounds(230, 190, 80, 25); this.panel.add(this.exitButton); // 变成小手 this.exitButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // 设置窗体的位置及大小 this.frame.setSize(460, 355); frame.setLocationRelativeTo(null); // 在屏幕中居中显示 frame.add(this.panel); // 添加面板 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置X号后关闭 //设置按钮 this.registerButton.addActionListener(this); //注册按钮 this.newPasswordButton.addActionListener(this); //忘记密码 this.loginButton.addActionListener(this); //登录 this.exitButton.addActionListener(this); //退出 // 往窗体里放其他控件 frame.setVisible(true); // 设置窗体可见 } @Override public void actionPerformed(ActionEvent e) { JButton bt = (JButton) e.getSource(); // 获取按钮信息 String str = bt.getText(); // 获取用户名 String name = this.userText.getText().trim(); // 获取密码 String password = this.passText.getText().trim(); // 获取验证码 String code = this.inputCode.getText().trim(); // 获取jsp验证码 String vcode = this.vcode.getCode(); // 登录 if (str.equals("登录")) { System.out.println("登录"); // 验证码转为大写 String Dcode = code.toUpperCase(); String Dvcode = vcode.toUpperCase(); // 验证码判断 if (Dcode.equals(Dvcode)) { //获取页面的用户名 String username=this.userText.getText().trim(); // 根据用户名查看是否有该用户 try { List loginUser=new LoginDao().queryAll(username); String a=loginUser.toString(); System.out.println(a.toString()); if(!a.toString().equals("[]")){ //密码判断 String mysqlPasword=loginUser.get(0).l_password(); if(mysqlPasword.equals(password)){ //登录成功 JOptionPane pane = new JOptionPane("登录成功"); JDialog dialog = pane.createDialog(this, "警告"); dialog.show(); }else{ JOptionPane pane = new JOptionPane("密码错误错误,请重新输入"); JDialog dialog = pane.createDialog(this, "警告"); dialog.show(); } }else{ JOptionPane pane = new JOptionPane("用户名错误,请重新输入"); JDialog dialog = pane.createDialog(this, "警告"); dialog.show(); } /*System.out.println(loginUser.toString()); String sqlUername=loginUser.get(0).getL_username();*/ /*int sqlpassword=loginUser.get(0).getL_power();*/ /*System.out.println("loginF:"+sqlUername);*/ } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } else { JOptionPane pane = new JOptionPane("验证码错误,请重新输入"); JDialog dialog = pane.createDialog(this, "警告"); System.out.println(dialog.getFont()); dialog.show(); } } else // 退出 if (str.equals("退出")) { System.out.println("退出"); System.exit(0); } else // 注册 if (str.equals("注 册")) { System.out.println("注 册"); } // 注册 else if (str.equals("忘记密码")) { System.out.println("忘记密码"); } else { System.out.println("异常错误"); } } public boolean isValidCodeRight() { System.out.println(this.jt_code.getText()); if (this.jt_code == null) { return false; } if (this.vcode == null) { return true; } if (this.vcode.getCode().equals(this.jt_code.getText())) { return true; } return false; } public static void main(String[] args) { new LoginFjame(); } }
学生成绩管理系统 设计与实现 ASP.NET C# namespace MarkManager { public partial class Login : Form { bool loginflag; public bool LoginFlag { get { return loginflag; } set { loginflag = value; } } //登录标志 public DataSet rs; public Login() { InitializeComponent(); } private void LoginButton_Click(object sender, EventArgs e) { loginflag = login(textBox1.Text, textBox2.Text, teacherRadio.Checked); if (loginflag) { MessageBox.Show("登录成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); } else MessageBox.Show("用户名或密码错误", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } /// <summary> /// 登录 /// </summary> /// <param name="name">用户名</param> /// <param name="password">密码</param> /// <param name="choice">是否教师登录</param> /// <returns>登录是否成功</returns> public bool login(string name, string password, bool choice) { FileInfo data = new FileInfo("data.mdb"); try { rs = new DataSet(); string ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;User Id=; Password=; Data Source=" + data.FullName; string SQLString; if (choice) //教师登录 { SQLString = "select TeacherID,TeacherName from Teacher where TeacherName='" + name + "' and Password='" + MyMD5.MyMD5String(password) + "'"; //密码用MD5加过密。在此考虑到密码的隐藏价值。来也间接修补了一个 //安全漏洞~ //对于当前的系统此密码有当前系统的价值,但是一般人都懒得记太多的密 //码,于是银行卡、学生证、其它密码都用同一密码,如果此密码被别人知 //道损失就会接连三,这里用了MD5不可逆转地记录密码,意味着就算 //别人知道了数据库里的密码项的值也不能得知密码的原文,把损失降低。 //电信的ADSL修改密码大概也是抱着这个想法。曾经一个朋友忘记了 //ADSL的密码,去电信厅修改,问:可以帮我查原来的密码吗? //答:不能。只能强行修改成新密码! OleDbDataAdapter da = new OleDbDataAdapter(SQLString, ConnString); //Teacher为表名 da.Fill(rs, "Teacher"); if (rs.Tables["Teacher"].Rows.Count > 0) //有记录登录成功 { return true; } else { return false; } } else //管理员登录 { SQLString = "select ID,Manager from Manager where Manager='" + name + "' and Password='" + MyMD5.MyMD5String(password) + "'"; OleDbDataAdapter da = new OleDbDataAdapter(SQLString, ConnString); da.Fill(rs, "Manager"); if (rs.Tables["Manager"].Rows.Count > 0) //有记录登录成功 { return true; } else { return false; } } } catch (OleDbException e) { MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception e) { MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } return false; } private void ExitButton_Click(object sender, EventArgs e) { this.Close(); } } }
可以使用Qt的信号和槽机制来实现登录注销功能。首先,创建一个登录窗口和主窗口,登录窗口中包含用户名和密码输入框以及登录按钮,主窗口中包含注销按钮。在登录按钮的clicked信号中,检查用户名和密码是否正确,如果正确则关闭登录窗口并打开主窗口,否则弹出错误提示框。在注销按钮的clicked信号中,关闭主窗口并重新打开登录窗口。以下是示例代码: // 登录窗口 class LoginWindow : public QWidget { Q_OBJECT public: LoginWindow(QWidget *parent = nullptr); signals: void loginSuccess(); private slots: void onLoginButtonClicked(); private: QLineEdit *m_usernameEdit; QLineEdit *m_passwordEdit; QPushButton *m_loginButton; }; LoginWindow::LoginWindow(QWidget *parent) : QWidget(parent) { m_usernameEdit = new QLineEdit(this); m_passwordEdit = new QLineEdit(this); m_passwordEdit->setEchoMode(QLineEdit::Password); m_loginButton = new QPushButton(tr("Login"), this); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(new QLabel(tr("Username:"), this)); layout->addWidget(m_usernameEdit); layout->addWidget(new QLabel(tr("Password:"), this)); layout->addWidget(m_passwordEdit); layout->addWidget(m_loginButton); connect(m_loginButton, &QPushButton::clicked, this, &LoginWindow::onLoginButtonClicked); } void LoginWindow::onLoginButtonClicked() { QString username = m_usernameEdit->text(); QString password = m_passwordEdit->text(); // 检查用户名和密码是否正确 if (username == "admin" && password == "123456") { emit loginSuccess(); close(); } else { QMessageBox::warning(this, tr("Error"), tr("Invalid username or password!")); } } // 主窗口 class MainWindow : public QWidget { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); private slots: void onLogoutButtonClicked(); private: QPushButton *m_logoutButton; }; MainWindow::MainWindow(QWidget *parent) : QWidget(parent) { m_logoutButton = new QPushButton(tr("Logout"), this); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(new QLabel(tr("Welcome!"), this)); layout->addWidget(m_logoutButton); connect(m_logoutButton, &QPushButton::clicked, this, &MainWindow::onLogoutButtonClicked); } void MainWindow::onLogoutButtonClicked() { LoginWindow *loginWindow = new LoginWindow(this); connect(loginWindow, &LoginWindow::loginSuccess, this, &MainWindow::show); hide(); loginWindow->show(); } // 应用程序入口 int main(int argc, char *argv[]) { QApplication app(argc, argv); LoginWindow loginWindow; MainWindow mainWindow; QObject::connect(&loginWindow, &LoginWindow::loginSuccess, &mainWindow, &MainWindow::show); loginWindow.show(); return app.exec(); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值