@@ -62,7 +62,7 @@ android {
|
||
| 62 | 62 |
minifyEnabled false |
| 63 | 63 |
shrinkResources false |
| 64 | 64 |
buildConfigField "boolean", "isTestMode", "false" |
| 65 |
- buildConfigField "boolean", "isJumpLogin", "true" |
|
| 65 |
+ buildConfigField "boolean", "isJumpLogin", "false" |
|
| 66 | 66 |
signingConfig signingConfigs.releaseConfig |
| 67 | 67 |
} |
| 68 | 68 |
} |
@@ -84,7 +84,6 @@ dependencies {
|
||
| 84 | 84 |
apt 'com.jakewharton:butterknife-compiler:8.2.1' |
| 85 | 85 |
compile 'com.google.code.gson:gson:2.7' |
| 86 | 86 |
compile files('libs/universal-image-loader-1.9.4.jar')
|
| 87 |
- compile files('libs/libammsdk.jar')
|
|
| 88 | 87 |
compile files('libs/commons-lang-2.6.jar')
|
| 89 | 88 |
compile files('libs/jcc-bate-0.7.3.jar')
|
| 90 | 89 |
compile 'com.umeng.analytics:analytics:latest.integration' |
@@ -1,5 +1,6 @@ |
||
| 1 | 1 |
package ai.pai.lensman.login; |
| 2 | 2 |
|
| 3 |
+import android.app.Activity; |
|
| 3 | 4 |
import android.content.Intent; |
| 4 | 5 |
import android.os.Bundle; |
| 5 | 6 |
import android.support.v4.app.FragmentActivity; |
@@ -11,11 +12,15 @@ import android.widget.ImageView; |
||
| 11 | 12 |
import android.widget.TextView; |
| 12 | 13 |
import android.widget.Toast; |
| 13 | 14 |
|
| 15 |
+import com.android.common.utils.LogHelper; |
|
| 14 | 16 |
import com.android.views.progressbar.ProgressWheel; |
| 15 | 17 |
|
| 18 |
+import org.json.JSONObject; |
|
| 19 |
+ |
|
| 16 | 20 |
import ai.pai.lensman.R; |
| 17 | 21 |
import ai.pai.lensman.activities.WebViewActivity; |
| 18 | 22 |
import ai.pai.lensman.main.MainActivity; |
| 23 |
+import ai.pai.lensman.qrcode.QRCaptureActivity; |
|
| 19 | 24 |
import butterknife.BindView; |
| 20 | 25 |
import butterknife.ButterKnife; |
| 21 | 26 |
import butterknife.OnClick; |
@@ -26,7 +31,7 @@ public class LoginActivity extends FragmentActivity implements LoginContract.Vie |
||
| 26 | 31 |
@BindView(R.id.tv_agree_protocol) TextView protocolText; |
| 27 | 32 |
@BindView(R.id.iv_login_logo) ImageView photoView; |
| 28 | 33 |
private LoginContract.Presenter presenter; |
| 29 |
- |
|
| 34 |
+ private static final int SCAN_WX_LOGIN_CODE = 2000; |
|
| 30 | 35 |
|
| 31 | 36 |
@Override |
| 32 | 37 |
protected void onCreate(Bundle savedInstanceState) {
|
@@ -36,7 +41,7 @@ public class LoginActivity extends FragmentActivity implements LoginContract.Vie |
||
| 36 | 41 |
SpannableString content = new SpannableString(getString(R.string.agree_protocol)); |
| 37 | 42 |
content.setSpan(new UnderlineSpan(), 6, content.length(), 0); |
| 38 | 43 |
protocolText.setText(content); |
| 39 |
- presenter = new LoginPresenter(this,this); |
|
| 44 |
+ presenter = new LoginPresenter(this); |
|
| 40 | 45 |
} |
| 41 | 46 |
|
| 42 | 47 |
|
@@ -49,11 +54,13 @@ public class LoginActivity extends FragmentActivity implements LoginContract.Vie |
||
| 49 | 54 |
@Override |
| 50 | 55 |
protected void onDestroy() {
|
| 51 | 56 |
super.onDestroy(); |
| 57 |
+ presenter.stop(); |
|
| 52 | 58 |
} |
| 53 | 59 |
|
| 54 | 60 |
@OnClick(R.id.btn_login) |
| 55 | 61 |
public void login(){
|
| 56 |
- presenter.login(); |
|
| 62 |
+ Intent intent = new Intent(this, QRCaptureActivity.class); |
|
| 63 |
+ startActivityForResult(intent, SCAN_WX_LOGIN_CODE); |
|
| 57 | 64 |
} |
| 58 | 65 |
|
| 59 | 66 |
@OnClick(R.id.tv_agree_protocol) |
@@ -90,4 +97,30 @@ public class LoginActivity extends FragmentActivity implements LoginContract.Vie |
||
| 90 | 97 |
finish(); |
| 91 | 98 |
} |
| 92 | 99 |
|
| 100 |
+ @Override |
|
| 101 |
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
| 102 |
+ super.onActivityResult(requestCode,resultCode,data); |
|
| 103 |
+ if (resultCode == Activity.RESULT_OK) {
|
|
| 104 |
+ if (data == null || data.getStringExtra("info") == null) {
|
|
| 105 |
+ Toast.makeText(this,R.string.scan_login_qr_error,Toast.LENGTH_SHORT).show(); |
|
| 106 |
+ return; |
|
| 107 |
+ } |
|
| 108 |
+ String qrInfo = data.getStringExtra("info");
|
|
| 109 |
+ if(qrInfo.contains("unionid") && qrInfo.contains("token")){
|
|
| 110 |
+ String json = qrInfo.replace(""","'");
|
|
| 111 |
+ LogHelper.d("czy","login scan qrcode = "+json);
|
|
| 112 |
+ try{
|
|
| 113 |
+ JSONObject jsonObject = new JSONObject(json); |
|
| 114 |
+ String unionid = jsonObject.getString("unionid");
|
|
| 115 |
+ String token = jsonObject.getString("token");
|
|
| 116 |
+ presenter.login(unionid,token); |
|
| 117 |
+ return; |
|
| 118 |
+ }catch (Exception e){
|
|
| 119 |
+ LogHelper.e("czy","login deal qrcode error"+e);
|
|
| 120 |
+ } |
|
| 121 |
+ } |
|
| 122 |
+ Toast.makeText(this,R.string.scan_login_qr_error,Toast.LENGTH_SHORT).show(); |
|
| 123 |
+ } |
|
| 124 |
+ } |
|
| 125 |
+ |
|
| 93 | 126 |
} |
@@ -14,7 +14,7 @@ public class LoginContract {
|
||
| 14 | 14 |
} |
| 15 | 15 |
|
| 16 | 16 |
interface Presenter extends BasePresenter{
|
| 17 |
- void login(); |
|
| 17 |
+ void login(String unionid, String token); |
|
| 18 | 18 |
} |
| 19 | 19 |
|
| 20 | 20 |
} |
@@ -1,9 +1,9 @@ |
||
| 1 | 1 |
package ai.pai.lensman.login; |
| 2 | 2 |
|
| 3 | 3 |
import android.os.AsyncTask; |
| 4 |
+import android.text.TextUtils; |
|
| 4 | 5 |
|
| 5 | 6 |
import com.android.common.executors.ThreadExecutor; |
| 6 |
-import com.android.common.utils.LogHelper; |
|
| 7 | 7 |
|
| 8 | 8 |
import org.json.JSONObject; |
| 9 | 9 |
|
@@ -20,183 +20,46 @@ import ai.pai.lensman.utils.UrlContainer; |
||
| 20 | 20 |
public class LoginInteractor implements BaseInteractor {
|
| 21 | 21 |
|
| 22 | 22 |
private HttpPostTask loginTask; |
| 23 |
- private HttpPostTask fetchTokenTask; |
|
| 24 |
- private HttpPostTask fetchUserInfoTask; |
|
| 25 | 23 |
private InteractorListener<String> listener; |
| 26 |
- private static final String APP_ID = "wxf4832536d9dda70a"; |
|
| 27 |
- private static final String APP_SECRET = "9a2efcae3c6038b5450b0c2ef3187b1f"; |
|
| 28 |
- private String wxCode; |
|
| 24 |
+ private String unionid; |
|
| 25 |
+ private String token; |
|
| 29 | 26 |
|
| 30 |
- public LoginInteractor(String wxCode, InteractorListener<String> listener) {
|
|
| 31 |
- this.wxCode = wxCode; |
|
| 27 |
+ public LoginInteractor(String unionid, String token, InteractorListener<String> listener) {
|
|
| 28 |
+ this.unionid = unionid; |
|
| 29 |
+ this.token = token; |
|
| 32 | 30 |
this.listener = listener; |
| 33 | 31 |
} |
| 34 | 32 |
|
| 35 | 33 |
@Override |
| 36 | 34 |
public void startJob() {
|
| 37 |
- fetchToken(); |
|
| 38 |
- } |
|
| 39 |
- |
|
| 40 |
- @Override |
|
| 41 |
- public void cancelJob() {
|
|
| 42 |
- cancelJob(loginTask); |
|
| 43 |
- cancelJob(fetchTokenTask); |
|
| 44 |
- cancelJob(fetchUserInfoTask); |
|
| 45 |
- } |
|
| 46 |
- |
|
| 47 |
- private void cancelJob(HttpPostTask task) {
|
|
| 48 |
- if (task == null) {
|
|
| 49 |
- return; |
|
| 50 |
- } |
|
| 51 |
- if (task.getStatus() == AsyncTask.Status.RUNNING) {
|
|
| 52 |
- task.cancel(true); |
|
| 53 |
- } |
|
| 54 |
- } |
|
| 55 |
- |
|
| 56 |
- private void fetchToken() {
|
|
| 57 |
- |
|
| 58 |
- final String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID |
|
| 59 |
- + "&secret=" + APP_SECRET + "&code=" + wxCode + "&grant_type=authorization_code"; |
|
| 60 |
- LogHelper.d("czy","interactor fetchToken with url = "+tokenUrl);
|
|
| 61 |
- fetchTokenTask = new HttpPostTask(null) {
|
|
| 62 |
- |
|
| 63 |
- String token; |
|
| 64 |
- String openId; |
|
| 65 |
- |
|
| 66 |
- @Override |
|
| 67 |
- protected boolean parseResponse(String response) {
|
|
| 68 |
- LogHelper.d("czy","interactor fetchToken parseResponse response = "+response);
|
|
| 69 |
- try {
|
|
| 70 |
- JSONObject json = new JSONObject(response); |
|
| 71 |
- token = json.getString("access_token");
|
|
| 72 |
- openId = json.getString("openid");
|
|
| 73 |
- return true; |
|
| 74 |
- } catch (Exception e) {
|
|
| 75 |
- e.printStackTrace(); |
|
| 76 |
- } |
|
| 77 |
- return false; |
|
| 78 |
- } |
|
| 79 |
- |
|
| 80 |
- @Override |
|
| 81 |
- protected void onPostSuccess() {
|
|
| 82 |
- super.onPostSuccess(); |
|
| 83 |
- fetchUserInfo(token, openId); |
|
| 84 |
- } |
|
| 85 |
- |
|
| 86 |
- @Override |
|
| 87 |
- protected void onPostFail() {
|
|
| 88 |
- super.onPostFail(); |
|
| 89 |
- } |
|
| 90 |
- }; |
|
| 91 |
- fetchTokenTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), tokenUrl); |
|
| 92 |
- } |
|
| 93 |
- |
|
| 94 |
- private void fetchUserInfo(String token, String openId) {
|
|
| 95 |
- |
|
| 96 |
- String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + token + "&openid=" + openId; |
|
| 97 |
- LogHelper.d("czy","interactor fetchUserInfo with url = "+userInfoUrl);
|
|
| 98 |
- fetchUserInfoTask = new HttpPostTask(null) {
|
|
| 99 |
- HashMap<String, String> params; |
|
| 100 |
- |
|
| 101 |
- @Override |
|
| 102 |
- protected boolean parseResponse(String response) {
|
|
| 103 |
- LogHelper.d("czy","interactor fetchUserInfo parseResponse response = "+response);
|
|
| 104 |
- try {
|
|
| 105 |
- JSONObject json = new JSONObject(response); |
|
| 106 |
- params = new HashMap<>(); |
|
| 107 |
- params.put("unionid", json.getString("unionid"));
|
|
| 108 |
- params.put("openid", json.getString("openid"));
|
|
| 109 |
- params.put("sex", json.getString("sex"));
|
|
| 110 |
- params.put("nickname", json.getString("nickname"));
|
|
| 111 |
- params.put("headimgurl", json.getString("headimgurl"));
|
|
| 112 |
- params.put("country", json.getString("country"));
|
|
| 113 |
- params.put("province", json.getString("province"));
|
|
| 114 |
- params.put("city", json.getString("city"));
|
|
| 115 |
- return true; |
|
| 116 |
- } catch (Exception e) {
|
|
| 117 |
- e.printStackTrace(); |
|
| 118 |
- } |
|
| 119 |
- return false; |
|
| 120 |
- } |
|
| 121 |
- |
|
| 122 |
- @Override |
|
| 123 |
- protected void onPostSuccess() {
|
|
| 124 |
- super.onPostSuccess(); |
|
| 125 |
- wxLogin(params); |
|
| 126 |
- } |
|
| 127 |
- |
|
| 128 |
- @Override |
|
| 129 |
- protected void onPostFail() {
|
|
| 130 |
- super.onPostFail(); |
|
| 131 |
- } |
|
| 132 |
- }; |
|
| 133 |
- fetchUserInfoTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), userInfoUrl); |
|
| 134 |
- } |
|
| 135 |
- |
|
| 136 |
- private void login() {
|
|
| 137 | 35 |
HashMap<String, String> params = new HashMap<>(); |
| 138 |
- params.put("username", "chengzhenyu");
|
|
| 139 |
- params.put("password", "paiai");
|
|
| 36 |
+ params.put("unionid", unionid);
|
|
| 37 |
+ params.put("token", token);
|
|
| 140 | 38 |
|
| 141 | 39 |
loginTask = new HttpPostTask(params) {
|
| 142 | 40 |
|
| 143 | 41 |
String lensmanId; |
| 144 | 42 |
String message; |
| 145 |
- |
|
| 146 |
- @Override |
|
| 147 |
- protected boolean parseResponse(String response) {
|
|
| 148 |
- try {
|
|
| 149 |
- JSONObject json = new JSONObject(response); |
|
| 150 |
- int status = json.getInt("status");
|
|
| 151 |
- if (status == 200) {
|
|
| 152 |
- JSONObject info = json.getJSONObject("data");
|
|
| 153 |
- lensmanId = info.getString("user_id");
|
|
| 154 |
- return true; |
|
| 155 |
- } else {
|
|
| 156 |
- message = json.getString("message");
|
|
| 157 |
- } |
|
| 158 |
- } catch (Exception e) {
|
|
| 159 |
- e.printStackTrace(); |
|
| 160 |
- } |
|
| 161 |
- return false; |
|
| 162 |
- } |
|
| 163 |
- |
|
| 164 |
- @Override |
|
| 165 |
- protected void onPostFail() {
|
|
| 166 |
- super.onPostFail(); |
|
| 167 |
- listener.onInteractFail(message); |
|
| 168 |
- } |
|
| 169 |
- |
|
| 170 |
- @Override |
|
| 171 |
- protected void onPostSuccess() {
|
|
| 172 |
- super.onPostSuccess(); |
|
| 173 |
- listener.onInteractSuccess(lensmanId); |
|
| 174 |
- } |
|
| 175 |
- }; |
|
| 176 |
- loginTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), UrlContainer.LOGIN_URL); |
|
| 177 |
- } |
|
| 178 |
- |
|
| 179 |
- private void wxLogin(HashMap<String, String> params) {
|
|
| 180 |
- |
|
| 181 |
- loginTask = new HttpPostTask(params) {
|
|
| 182 |
- |
|
| 183 |
- String lensmanId; |
|
| 184 | 43 |
String userName; |
| 185 |
- String message; |
|
| 186 | 44 |
|
| 187 | 45 |
@Override |
| 188 | 46 |
protected boolean parseResponse(String response) {
|
| 189 |
- LogHelper.d("czy","interactor wxLogin parseResponse response = "+response);
|
|
| 190 | 47 |
try {
|
| 191 | 48 |
JSONObject json = new JSONObject(response); |
| 192 | 49 |
int status = json.getInt("status");
|
| 193 | 50 |
if (status == 200) {
|
| 194 | 51 |
JSONObject info = json.getJSONObject("data");
|
| 195 | 52 |
lensmanId = info.getString("user_id");
|
| 196 |
- userName = info.getString("nickname");
|
|
| 53 |
+ userName = info.getString("name");
|
|
| 54 |
+ if(TextUtils.isEmpty(userName)){
|
|
| 55 |
+ userName = info.getString("nickname");
|
|
| 56 |
+ } |
|
| 57 |
+ if(TextUtils.isEmpty(userName)){
|
|
| 58 |
+ userName = info.getString("username");
|
|
| 59 |
+ } |
|
| 197 | 60 |
return true; |
| 198 | 61 |
} else {
|
| 199 |
- message = json.getString("message");
|
|
| 62 |
+ message = json.getString("description");
|
|
| 200 | 63 |
} |
| 201 | 64 |
} catch (Exception e) {
|
| 202 | 65 |
e.printStackTrace(); |
@@ -218,7 +81,22 @@ public class LoginInteractor implements BaseInteractor {
|
||
| 218 | 81 |
Preferences.getInstance().setUserName(userName); |
| 219 | 82 |
} |
| 220 | 83 |
}; |
| 221 |
- loginTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), UrlContainer.WX_LOGIN_URL); |
|
| 84 |
+ loginTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), UrlContainer.BOX_LENSMAN_LOGIN_URL); |
|
| 222 | 85 |
} |
| 223 | 86 |
|
| 87 |
+ @Override |
|
| 88 |
+ public void cancelJob() {
|
|
| 89 |
+ cancelJob(loginTask); |
|
| 90 |
+ } |
|
| 91 |
+ |
|
| 92 |
+ private void cancelJob(HttpPostTask task) {
|
|
| 93 |
+ if (task == null) {
|
|
| 94 |
+ return; |
|
| 95 |
+ } |
|
| 96 |
+ if (task.getStatus() == AsyncTask.Status.RUNNING) {
|
|
| 97 |
+ task.cancel(true); |
|
| 98 |
+ } |
|
| 99 |
+ } |
|
| 100 |
+ |
|
| 101 |
+ |
|
| 224 | 102 |
} |
@@ -1,13 +1,9 @@ |
||
| 1 | 1 |
package ai.pai.lensman.login; |
| 2 | 2 |
|
| 3 |
-import android.content.Context; |
|
| 4 |
-import android.text.TextUtils; |
|
| 5 |
- |
|
| 6 | 3 |
import com.android.common.utils.LogHelper; |
| 7 |
-import com.tencent.mm.sdk.modelmsg.SendAuth; |
|
| 8 |
-import com.tencent.mm.sdk.openapi.IWXAPI; |
|
| 9 |
-import com.tencent.mm.sdk.openapi.WXAPIFactory; |
|
| 10 | 4 |
|
| 5 |
+import ai.pai.lensman.App; |
|
| 6 |
+import ai.pai.lensman.R; |
|
| 11 | 7 |
import ai.pai.lensman.base.BaseInteractor; |
| 12 | 8 |
import ai.pai.lensman.db.Preferences; |
| 13 | 9 |
|
@@ -16,39 +12,24 @@ import ai.pai.lensman.db.Preferences; |
||
| 16 | 12 |
*/ |
| 17 | 13 |
public class LoginPresenter implements LoginContract.Presenter,BaseInteractor.InteractorListener<String> {
|
| 18 | 14 |
|
| 19 |
- private IWXAPI api; |
|
| 20 |
- private Context context; |
|
| 21 | 15 |
private LoginContract.View view; |
| 22 | 16 |
private LoginInteractor interactor; |
| 23 |
- private static final String APP_ID = "wxf4832536d9dda70a"; |
|
| 24 | 17 |
|
| 25 |
- public LoginPresenter(Context context,LoginContract.View view){
|
|
| 18 |
+ public LoginPresenter(LoginContract.View view){
|
|
| 26 | 19 |
this.view = view; |
| 27 |
- this.context = context; |
|
| 28 |
- api = WXAPIFactory.createWXAPI(context, APP_ID, true); |
|
| 29 |
- api.registerApp(APP_ID); |
|
| 30 | 20 |
} |
| 31 | 21 |
|
| 32 | 22 |
@Override |
| 33 |
- public void login() {
|
|
| 23 |
+ public void login(String unionid, String token) {
|
|
| 34 | 24 |
LogHelper.d("czy","presenter login");
|
| 35 |
- |
|
| 36 |
- SendAuth.Req req = new SendAuth.Req(); |
|
| 37 |
- req.scope = "snsapi_userinfo"; |
|
| 38 |
- req.state = "paiai_for_lensman"; |
|
| 39 |
- api.sendReq(req); |
|
| 25 |
+ view.showProgressView(); |
|
| 26 |
+ interactor = new LoginInteractor(unionid,token,this); |
|
| 27 |
+ interactor.startJob(); |
|
| 40 | 28 |
} |
| 41 | 29 |
|
| 42 | 30 |
@Override |
| 43 | 31 |
public void start() {
|
| 44 |
- String wxCode = Preferences.getInstance().getWXCode(); |
|
| 45 |
- LogHelper.d("czy","presenter start with wx code = "+wxCode);
|
|
| 46 |
- if(!TextUtils.isEmpty(wxCode)){
|
|
| 47 |
- view.showProgressView(); |
|
| 48 |
- interactor = new LoginInteractor(wxCode,this); |
|
| 49 |
- interactor.startJob(); |
|
| 50 |
- Preferences.getInstance().setWXCode("");
|
|
| 51 |
- } |
|
| 32 |
+ |
|
| 52 | 33 |
} |
| 53 | 34 |
|
| 54 | 35 |
@Override |
@@ -62,6 +43,7 @@ public class LoginPresenter implements LoginContract.Presenter,BaseInteractor.In |
||
| 62 | 43 |
@Override |
| 63 | 44 |
public void onInteractSuccess(String result) {
|
| 64 | 45 |
view.hideProgressView(); |
| 46 |
+ view.showLoginHint(App.getAppContext().getString(R.string.login_success)); |
|
| 65 | 47 |
Preferences.getInstance().setLensManId(result); |
| 66 | 48 |
view.jumpMain(); |
| 67 | 49 |
} |
@@ -11,8 +11,6 @@ public class UrlContainer {
|
||
| 11 | 11 |
|
| 12 | 12 |
public static final String LOGIN_URL = HOST_URL+"login"; |
| 13 | 13 |
|
| 14 |
- public static final String SESSION_IDS_CREATE = HOST_URL+"uuid"; |
|
| 15 |
- |
|
| 16 | 14 |
/** |
| 17 | 15 |
* user_id # 用户唯一标识 |
| 18 | 16 |
* nickname # 用户昵称 |
@@ -71,9 +69,6 @@ public class UrlContainer {
|
||
| 71 | 69 |
|
| 72 | 70 |
public static final String SERVER_TIME_URL=HOST_URL+"s/server_time"; |
| 73 | 71 |
|
| 74 |
- /** |
|
| 75 |
- * 盒子程序版本信息 |
|
| 76 |
- */ |
|
| 77 |
- public static final String BOX_VERSION_URL = HOST_URL+"op/bpversion"; |
|
| 72 |
+ public static final String BOX_LENSMAN_LOGIN_URL = HOST_URL+"box/loginqr"; |
|
| 78 | 73 |
|
| 79 | 74 |
} |
@@ -47,7 +47,7 @@ |
||
| 47 | 47 |
android:layout_marginBottom="50dp" |
| 48 | 48 |
android:background="@drawable/login_btn_rounded_rect_bg" |
| 49 | 49 |
android:gravity="center" |
| 50 |
- android:text="@string/wx_login" |
|
| 50 |
+ android:text="@string/wx_scan_login" |
|
| 51 | 51 |
android:textColor="@color/wx_login_btn_stroke" |
| 52 | 52 |
android:textSize="18sp" /> |
| 53 | 53 |
|
@@ -12,6 +12,7 @@ |
||
| 12 | 12 |
<string name="settings">设置</string> |
| 13 | 13 |
<string name="scene">场景%d</string> |
| 14 | 14 |
|
| 15 |
+ <string name="wx_scan_login">扫描拍爱公众号授权码</string> |
|
| 15 | 16 |
<string name="wx_login">微信登录</string> |
| 16 | 17 |
<string name="agree_protocol">已阅读并同意<u>拍爱用户协议</u></string> |
| 17 | 18 |
|
@@ -143,4 +144,6 @@ |
||
| 143 | 144 |
<string name="usb_permission_denied">请检查设备是否已开放root权限</string> |
| 144 | 145 |
|
| 145 | 146 |
<string name="sdcard_error">保存照片失败,请检查手机存储卡</string> |
| 147 |
+ |
|
| 148 |
+ <string name="scan_login_qr_error">扫描授权码失败</string> |
|
| 146 | 149 |
</resources> |