解决shareUserId导致的app无法升级的问题

老版本app版本号是2.0.13,Build是20160719。新版本app版本号是2.0.14,Build是2016101301。
初略看来应该是可以覆盖升级的,但是安装新版本的时候提示“应用未安装”。
网上找了一下,大致原因有以下几种:

  • 签名冲突

android AsyncTask示例

android实现异步的方法有很多种,本文只介绍用的比较多的AsyncTask。从类名就可以看出来该类是专为异步而生,API也很简单。

AsyncTask接口原型

1
2
3
public abstract class AsyncTask<Params, Progress, Result> {
...
}

该类是个抽象类,有三个泛型参数,说明如下:

android选择图片返回统一图片地址

android从选择图片有两种方法,但是返回值确不同,本文将指导大家如何统一这两种方式的返回值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//关键代码
@Event(R.id.btnPhoto)
private void onBtnPhotoClicked(View view) {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, Config.Constants.CODE_PICK_IMAGE_FROM_PHOTO);
}

@Event(R.id.btnCamera)
private void onBtnCameraClicked(View view) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, Config.Constants.CODE_PICK_IMAGE_FROM_CAMERA);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case Config.Constants.CODE_PICK_IMAGE_FROM_CAMERA:
if (data != null && data.hasExtra("data")) {
Bitmap bitmap = data.getParcelableExtra("data");
bitmap = BitmapUtil.scale(bitmap, 640.0f / bitmap.getWidth());
try {
File path = new File(((MyApplication) getApplication()).appPath, DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".jpg");
FileOutputStream outputStream = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.close();
Intent intent = new Intent();
intent.putExtra("path", path.getAbsolutePath());
setResult(RESULT_OK, intent);
} catch (IOException e) {
e.printStackTrace();
}
}
finish();
break;
case Config.Constants.CODE_PICK_IMAGE_FROM_PHOTO:
if(data != null){
Uri uri = data.getData();
Bitmap bitmap;
ContentResolver contentResolver = getContentResolver();
try {
bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri);
bitmap = BitmapUtil.scale(bitmap, 640.0f / bitmap.getWidth());
File path = new File(((MyApplication) getApplication()).appPath, DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".jpg");
FileOutputStream outputStream = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.close();
Intent intent = new Intent();
intent.putExtra("path", path.getAbsolutePath());
setResult(RESULT_OK, intent);
} catch (IOException e) {
e.printStackTrace();
}
}
finish();
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
//BitmapUtil.java
public static Bitmap scale(Bitmap bitmap, float scale) {
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}

//MyApplication
public File appPath;

@Override
public void onCreate() {
super.onCreate();
//创建目录
appPath = new File(Environment.getExternalStorageDirectory(), getPackageName());
if (!appPath.isDirectory()) {
appPath.mkdir();
}
}

经过统一处理之后,返回值均为图片的绝对路径地址。

百度推送收到消息时带参数启动activity

一般来说,在BPushReceiver的onNotificationClicked或者onMessage方法收到推送消息后会去启动一个activity。此时整个应用有以下几种状态:

  • 应用进程不存在

android直接挂断电话

最近在写一个用来发短信的机器人(android),当然需要屏蔽所有来电了。多的话不说了,直接看步骤。(IDE为android studio):
1.在 src/main下新建 aidl 目录。

2.在src/main/aidl下新建包 com.android.internal.telephony。

3.在com.android.internal.telephony新建文件 ITelephony.aidl,内容如下:

android实现圆形带进度条的ProgressBar

android加载图片免不了使用加载进度显示,而android自带的progressBar有局限.

  1. 圆型的progressBar不能显示进度条,只能无限制转圈圈

android datepicker和timepicker显示在一行

android默认的datepicker和默认的timepicker可以放在一行(Linelayout),但是timepicker右边会“挤出”屏幕,尝试设置layout_weight和layout_height对于布局有效,但是控件显示就不完整了。到这一步发现xml不局文件已经处理不了,所以自然想到应该利用java来处理了。

效果图

效果图

布局代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="10dp">

<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/datePicker"
android:calendarViewShown="false" />

<TimePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/timePicker" />
</LinearLayout>

IllegalStateException: Can not perform this action after onSaveInstanceState

今天使用Fragment的时候,出现了这个错误 IllegalStateException: Can not perform this action after onSaveInstanceState。查看一下控制台,发现是FragmentManager的commit()方法报错的,看字面意思应该是

onSaveInstanceState这个方法之后不能处理这个操作(指commit())。

因为onSaveInstanceState
方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存完状态后再给它添加Fragment就会出错。解决办法就是把commit()方法替换成 commitAllowingStateLoss()就行了,其效果是一样的。

android使用ImageLoader缓存图片

缓存和异步是两个极大提升用户体验的好东西,android加载图片时的开销还是挺大的,要是不做缓存同步加载,网速不给力的情况下,等个十几秒是有可能的。

今天要说的是一个叫做ImageLoader的库

GITHUB:https://github.com/nostra13/Android-Universal-Image-Loader

async http client socket超时问题

最近做的一个项目的HTTP模块使用了loopj的asynchttpclient (https://github.com/loopj/android-async-http)。

自动更新模块总是出现sockettimeout的exception,查来查去也不知道什么问题,为此还换了asynchttpclient的库版本。但是问题也没解决。

仔细看了一下,提示的是timeout,应该从这方面去看看,后面看到自己的HTTP工具类设置了全局超时时间为5000ms,普通请求当然没这么久,但是自动更新是下载,肯定不止5秒的,删掉超时设置就可以了。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×