Android 问题整理 八
// 支付宝提现 支付宝授权 支付宝登录 2021年6月8日09:17:06
2021年6月9日11:28:57 发现问题;android 11 进入支付宝H5页面,点击打开支付宝,无法调用启动支付宝
alipaysdk-15.8.03.210428205839.aar
// 支付宝 SDK AAR 包所需的配置
implementation (name: 'alipaysdk-15.8.03.210428205839', ext: 'aar')
<!-- 为了使用 "通用跳转 SDK" 的能力,需要在您的 App 的 AndroidManifest.xml 中添加这一项 -->
<!-- 并合理设置 android:scheme 的值 -->
<activity android:name="com.alipay.sdk.app.AlipayResultActivity" tools:node="merge">
<intent-filter tools:node="replace">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="__alipaysdkdemo__"/>
</intent-filter>
</activity>
/**
* 通用跳转授权业务 Demo
*/
public void openAuthScheme( ) {
// 传递给支付宝应用的业务参数
final Map<String, String> bizParams = new HashMap<>();
bizParams.put("url", "https://authweb.alipay.com/auth?auth_type=PURE_OAUTH_SDK&app_id=202**************92&scope=auth_user&state=init");
// 支付宝回跳到您的应用时使用的 Intent Scheme。
// 请设置为一个不和其它应用冲突的值,并在 AndroidManifest.xml 中为 AlipayResultActivity 的 android:scheme 属性
// 指定相同的值。实际使用时请勿设置为 __alipaysdkdemo__ 。
// 如果不设置,OpenAuthTask.execute() 在用户未安装支付宝,使用网页完成业务流程后,将无法回跳至您的应用。
final String scheme = "__alipaysdkdemo__";
// 防止在支付宝 App 被强行退出等意外情况下,OpenAuthTask.Callback 一定时间内无法释放,导致
// Activity 泄漏
final WeakReference<Activity> ctxRef = new WeakReference<>(this);
// 唤起授权业务
final OpenAuthTask task = new OpenAuthTask(this);
task.execute(
scheme, // Intent Scheme
OpenAuthTask.BizType.AccountAuth, // 业务类型
bizParams, // 业务参数
new OpenAuthTask.Callback() {
@Override
public void onResult(int i, String s, Bundle bundle) {
final Context ref = ctxRef.get();
if (ref != null) {
// showAlert(ref, String.format("结果码: %s\n结果信息: %s\n结果数据: %s", i, s, bundleToString(bundle)));
Log.e("===========", String.format("结果码: %s\n结果信息: %s\n结果数据: %s", i, s, bundleToString(bundle)));
// 结果数据:
// app_id=>202***********492
// result_code=>SUCCESS
// scope=>auth_user
// state=>init
// auth_code=>4***451************fad7****
}
}
}, // 业务结果回调
true); // 是否需要在用户未安装支付宝 App 时,使用 H5 中间页中转。建议设置为 true。
}
private static String bundleToString(Bundle bundle) {
if (bundle == null) {
return "null";
}
final StringBuilder sb = new StringBuilder();
for (String key : bundle.keySet()) {
sb.append(key).append("=>").append(bundle.get(key)).append("\n");
}
return sb.toString();
}
allprojects {
maven { url 'https://jitpack.io' }
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
maven { url 'https://dl.bintray.com/umsdk/release' }
// 支付宝 SDK AAR 包所需的配置
flatDir {
dirs 'libs'
}
}
}
// recyclerView.setAdapter 外部类
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
RecyclerView recyclerView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
recyclerView = findViewById(R.id.recyclerView);
recyclerView1 = findViewById(R.id.recyclerView1);
initList(recyclerView, 10);
initList(recyclerView1, 30);
}
private void initList(RecyclerView recyclerView, int size) {
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new ZowneoAdapter(this).setSize(size));
}
}
// 谷歌流式布局库 implementation 'com.google.android:flexbox:1.0.0'
FlexboxLayoutManager manager = new FlexboxLayoutManager(this, FlexDirection.ROW, FlexWrap.WRAP) {
@Override
public boolean canScrollVertically() {
return false;
}
};
recyclerView.setLayoutManager(manager);
public class ZowneoAdapter extends RecyclerView.Adapter<ZowneoAdapter.Vh> {
List<String> list = new ArrayList<>();
Activity activity;
int size;
int[] resource;
public ZowneoAdapter ZowneoAdapter(Activity activity, List<String> list) {
this.activity = activity;
this.list = list;
return this;
}
/**
* @param activity
* @param resource 列表项
*/
public ZowneoAdapter(Activity activity, int... resource) {
this.activity = activity;
this.resource = resource;
}
@NonNull
@Override
public Vh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View inflate;
if (resource.length == 0) {
inflate = LayoutInflater.from(activity).inflate(R.layout.item_user_home_report, parent, false);
} else {
inflate = LayoutInflater.from(activity).inflate(resource[0], parent, false);
}
return new Vh(inflate);
}
@Override
public void onBindViewHolder(@NonNull Vh vh, int position) {
vh.setData(position);
}
public void setResource(int[] resource) {
this.resource = resource;
notifyDataSetChanged();
}
public void setList(List<String> list) {
this.list = list;
notifyDataSetChanged();
}
public ZowneoAdapter setSize(int size) {
this.size = size;
notifyDataSetChanged();
return this;
}
@Override
public int getItemCount() {
if (size == 0) {
return list.size();
} else {
return size;
}
}
static class Vh extends RecyclerView.ViewHolder {
TextView word_tv;
public Vh(View itemView) {
super(itemView);
word_tv = itemView.findViewById(R.id.word_tv);
}
void setData(final int position) {
}
}
}
item_user_home_report.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<TextView
android:id="@+id/word_tv"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textSize="12sp"
android:background="@android:color/holo_blue_light"
android:paddingHorizontal="10dp"
android:paddingVertical="5dp"
android:textColor="#666666" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="#F5F5F5"
android:visibility="visible" />
</LinearLayout>
// recyclerView.setAdapter 内部类
RecyclerView recyclerView;
RecyclerView recyclerView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
recyclerView = findViewById(R.id.recyclerView);
recyclerView1 = findViewById(R.id.recyclerView1);
initList(recyclerView, 10);
initList(recyclerView1, 100);
initList(recyclerView1, 8);
}
RecyclerView.Adapter adapter;
private void initList(RecyclerView recyclerView, final int size) {
private void initList(RecyclerView recyclerView, int size) {
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new RecyclerView.Adapter<Vh>() {
@NonNull
@Override
public Vh onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View inflate = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_user_home_report, viewGroup, false);
return new Vh(inflate);
}
@Override
public void onBindViewHolder(@NonNull Vh vh, int i) {
vh.setData(i );
}
@Override
public int getItemCount() {
return size;
}
};
ZowneoAdapter adapter = new ZowneoAdapter(this, size);
recyclerView.setAdapter(adapter);
}
static class Vh extends RecyclerView.ViewHolder {
TextView word_tv;
public Vh(View itemView) {
super(itemView);
word_tv = itemView.findViewById(R.id.word_tv);
}
void setData(final int position ) {
}
}
// webview加载富文本
public static void setH5Data(WebView webView, String h5_Str) {
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("<!DOCTYPE html>\n" +
"<html>\n" +
" <head>\n" +
" <meta charset=\"utf-8\">\n" +
" <meta name=\"viewport\" content=\"width=device-width,initial-scale=1,user-scalable=0\">\n" +
" <title></title>\n" +
" </head>\n" +
" <body>\n");
stringBuffer.append(h5_Str);
stringBuffer.append("</body></html>");
// h5_Str="<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,user-scalable=0\">";
h5_Str=stringBuffer.toString();
h5_Str = h5_Str.replace("<img", "<img style=\"display:block;\" width=\"100%\"")
.replace("<p", "<p style=\"margin:0\"");
webView.loadDataWithBaseURL(null, h5_Str,"text/html", "utf-8", null);
}
// 获取手机型号 // 获取手机系统版本号 获取版本号
android.os.Build.MODEL;//手机型号
android.os.Build.VERSION.RELEASE;//手机系统版本号
/**
* 获取版本号
*/
public static String getVersion() {
if (TextUtils.isEmpty(sVersion)) {
try {
PackageManager manager = CommonAppContext.sInstance.getPackageManager();
PackageInfo info = manager.getPackageInfo(CommonAppContext.sInstance.getPackageName(), 0);
sVersion = info.versionName;
} catch (Exception e) {
e.printStackTrace();
}
}
return sVersion;
}
// get提交和post提交的区别:
GET方式: 将表单数据,以”name=value”形式追加到action指定的处理程序的后面,两者间用”?”隔开,每一个表单的”name=value”间用”&”号隔开。 特点:只适合提交少量信息,并且不太安全(不要提交敏感数据)、提交的数据类型只限于ASCII字符。
POST方式: 将表单数据直接发送(隐藏)到action指定的处理程序。POST发送的数据不可见。Action指定的处理程序可以获取到表单数据。 特点:可以提交海量信息,相对来说安全一些,提交的数据格式是多样的(Word、Excel、rar、img)。