www.nginx.cnsitemap

存档

‘android’ 分类的存档

前段时间android应用开发遇到的问题

2013年8月3日 没有评论

由于android是自己现学现卖,每次都会遇到新问题,做个记号,减少下次遇到问题时,重新查找一边的痛苦。

1.]Unable to get view server version from device

只能是模拟器生效

2.屏幕宽度减去间距margin后,图片FitXy被拉伸 this.g = (localResources.getDisplayMetrics().widthPixels - localResources.getDimensionPixelOffset(R.dimen.list_large_image_padding));

查了很久发现宽度由于9.png的原因增加了40px,需要减掉。用9.png工具查看一个方格1px

3.虽然删掉了文件,但是文件没关闭,所以不能再新建文件,也就是内核文件未释放。文件操作完需要close掉。

4.SkImageDecoder::Factory returned null流不能二次操作。

于是看明白了,第一次取图片尺寸的时候is这个InputStream被使用过了,再真正取图片的时候又使用了这个InputStream,此时流的起始位置已经被移动过了,需要调用is.reset()来重置,然后再decodeStream(imgInputStream, null, options)就没问题了。
但是注意一个问题,is.mark(1024)是SDK中写死的,如果图片的大小超过1024字节,第一次decode取尺寸之后调用is.reset()会抛出IOException,所以建议使用BitmapFactory的其他decode方法,如果是网络读过来的流,最好在本地存成文件缓存,然后通过decodeFileDescriptor方法就没这种问题了。

5.
Uncaught exception thrown by finalizer

Could not find class 'org.apache.commons.httpclient.HttpClient'

android.app.Application cannot be cast to

Unable to execute dex: Multiple dex files define Landroi

在打包的过程中可能会出现这样的问题,原因是有重复的。jar被引用,可以查看你的build path,尤其是Android Dependencies一定有重复引入的.jar包,解决的方法是在libs删除重复的jar即可。

6.

Package cc.gxtp.ui has no certificates at entry res/anim/loading.xml; ignoring!

没有签名

分类: android 标签:

android bitmap oom 优化

2013年6月25日 没有评论

android使用位图显示图片,也就是像素点,jpg之类的压缩格式在android都会转成bitmap。

现在手机的分辨率也越来越高,480*800 大小的图片使用的内存大小:

480*800*32/8=1536000 =1.5M

32表示32位色,每个字节8位。

手机上有很多长图大小都是600*10000*32/8=24M,这样一来手机OOM是迟早的事。一些采用缩放和降低画质是解决不了问题的

例如下面这两种缩放还是会出现内存溢出的问题,

如何能让anroid获取网络图片时内存不OOM方法,使用BitmapFactory.decodeStream替代createBitmap方法,

原因是该方法直读取图片字节,调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap。

android使用Matrix实现bitmap缩放

[java]
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);

int width = bitmap.getWidth();
int height = bitmap.getHeight();
int newWidth = 640;
int newHeight = 480;

float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;

Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);

// create the new Bitmap object
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
[/java]

android使用options.inJustDecodeBounds实现bitmap缩放

[java]
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
if (options.mCancel || options.outWidth == -1
|| options.outHeight == -1) {
Log.d("OomDemo", "alert!!!" + String.valueOf(options.mCancel)
+ " " + options.outWidth + options.outHeight);
return null;
}
options.inSampleSize = Util.computeSampleSize(options, 600, (int) (1 * 1024 * 1024));
Log.d("OomDemo", "inSampleSize: " + options.inSampleSize);
options.inJustDecodeBounds = false;
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888; // 默认是Bitmap.Config.ARGB_8888
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
[/java]

//四种构造Bitmap的使用的字节数
Bitmap.createBitmap(width, height,Bitmap.Config.ALPHA_8); 8bit
Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_4444); 12bit
Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888); 32bit
Bitmap.createBitmap(width, height,Bitmap.Config.RGB_565); 16bit

[java]
public class Util {

/*
* Compute the sample size as a function of minSideLength
* and maxNumOfPixels.
* minSideLength is used to specify that minimal width or height of a
* bitmap.
* maxNumOfPixels is used to specify the maximal size in pixels that is
* tolerable in terms of memory usage.
*
* The function returns a sample size based on the constraints.
* Both size and minSideLength can be passed in as IImage.UNCONSTRAINED,
* which indicates no care of the corresponding constraint.
* The functions prefers returning a sample size that
* generates a smaller bitmap, unless minSideLength = IImage.UNCONSTRAINED.
*
* Also, the function rounds up the sample size to a power of 2 or multiple
* of 8 because BitmapFactory only honors sample size this way.
* For example, BitmapFactory downsamples an image by 2 even though the
* request is 3. So we round up the sample size to avoid OOM.
*/
public static int computeSampleSize(BitmapFactory.Options options,
int minSideLength, int maxNumOfPixels) {
int initialSize = computeInitialSampleSize(options, minSideLength,
maxNumOfPixels);

int roundedSize;
if (initialSize <= 8) {
roundedSize = 1;
while (roundedSize < initialSize) {
roundedSize <<= 1;
}
} else {
roundedSize = (initialSize + 7) / 8 * 8;
}
return roundedSize;
}

public static int computeInitialSampleSize(BitmapFactory.Options options,
int minSideLength, int maxNumOfPixels) {
double w = options.outWidth;
double h = options.outHeight;
int lowerBound = (maxNumOfPixels == -1) ? 1 :
(int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == -1) ? 128 :
(int) Math.min(Math.floor(w / minSideLength),
Math.floor(h / minSideLength));

if (upperBound < lowerBound) {
// return the larger one when there is no overlapping zone.
return lowerBound;
}

if ((maxNumOfPixels == -1) &&
(minSideLength == -1)) {
return 1;
} else if (minSideLength == -1) {
return lowerBound;
} else {
return upperBound;
}
}

}

[/java]

android上屏幕密度和像素转换
[java]
//转换dip为px

public static int convertDIP2PX(Context context, int dip) {
float scale = context.getResources().getDisplayMetrics().density;
return (int)(dip*scale + 0.5f*(dip>=0?1:-1));
}

//转换px为dip
public static int convertPX2DIP(Context context, int px) {
float scale = context.getResources().getDisplayMetrics().density;
return (int)(px/scale + 0.5f*(px>=0?1:-1));
}
[/java]
可以参考这里的实现方法
http://www.java2s.com/Open-Source/Android/android-platform-apps/Gallery3D/com/cooliris/media/UriTexture.java.htm

分类: android 标签: , ,

Android Intent 使用方法

2012年2月28日 没有评论

//show webapp:

Uri uri = Uri.parse("http://www.google.com");
Intent it = new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);

//show maps:
Uri uri = Uri.parse("geo:38.899533,-77.036476");
Intent it = new Intent(Intent.Action_VIEW,uri);
startActivity(it);

//show ways
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
Intent it = new Intent(Intent.ACTION_VIEW,URI);
startActivity(it);

//call dial program
Uri uri = Uri.parse("tel:xxxxxx");
Intent it = new Intent(Intent.ACTION_DIAL, uri);
startActivity(it);

Uri uri = Uri.parse("tel.xxxxxx");
Intent it =new Intent(Intent.ACTION_CALL,uri);
//don't forget add this config:

//send sms/mms
//call sender program
Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body", "The SMS text");
it.setType("vnd.android-dir/mms-sms");
startActivity(it);

//send sms
Uri uri = Uri.parse("smsto:0800000123");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
it.putExtra("sms_body", "The SMS text");
startActivity(it);

//send mms
Uri uri = Uri.parse("content://media/external/images/media/23");
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra("sms_body", "some text");
it.putExtra(Intent.EXTRA_STREAM, uri);
it.setType("image/png");
startActivity(it);

//send email

Uri uri = Uri.parse("mailto:xxx@abc.com");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);

Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.setType("text/plain");
startActivity(Intent.createChooser(it, "Choose Email Client"));

Intent it=new Intent(Intent.ACTION_SEND);
String[] tos={"me@abc.com"};
String[] ccs={"you@abc.com"};
it.putExtra(Intent.EXTRA_EMAIL, tos);
it.putExtra(Intent.EXTRA_CC, ccs);
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.setType("message/rfc822");
startActivity(Intent.createChooser(it, "Choose Email Client"));

//add extra
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");
sendIntent.setType("audio/mp3");
startActivity(Intent.createChooser(it, "Choose Email Client"));

//play media
Intent it = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/song.mp3");
it.setDataAndType(uri, "audio/mp3");
startActivity(it);

Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

//Uninstall
Uri uri = Uri.fromParts("package", strPackageName, null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);
startActivity(it);

//uninstall apk
Uri uninstallUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);

//install apk
Uri installUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

//play audio
Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3");
returnIt = new Intent(Intent.ACTION_VIEW, playUri);

//send extra
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3");
sendIntent.setType("audio/mp3");
startActivity(Intent.createChooser(it, "Choose Email Client"));

//search
Uri uri = Uri.parse("market://search?q=pname:pkg_name");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
//where pkg_name is the full package path for an application
阅读全文...

分类: android 标签:

spinner设置默认初始值

2012年2月25日 没有评论

ArrayAdapter adapter = new ArrayAdapter
(this, android.R.layout.simple_layout, /*here is your array list*/);

spinner.setAdapter(adapter);

int position = adapter.getPosition(/*here is some string in your array list*/);

spinner.setSelection(position , true);

分类: android 标签:

Android下Listview的onItemClick以及onItemLongClick

2012年2月22日 没有评论

1.ListView本身可不可以调用setOnClickListner()?

代码上可以,但是运行马上会丢出异常,所以是不可以拦截Listview本身的click事件。

2.ListView.setOnItemClickListener设置的listener什么时候会被调用?

当点击某行内容是会被调用,但是如果这行内容中包含Button,ImgButton等控件时就不会被调用,为什么以及怎么解决见后面。

3.ListView.setOnItemLongClickListener设置的listener什么时候被调用?

当长按某一行时会被调用,而且在抬起之前就已经调用了。

4.收到LongClick的调用后还会调用click吗?

这个要根据LongClick listener的返回值来决定。

如果返回false那么click仍然会被调用。而且是先调用Long click,然后调用click。

如果返回true那么click就会被吃掉,click就不会再被调用了。

  5.监听click以及long click影响弹出菜单吗?

click不影响;long click如果返回true那么就会吃掉click事件,导致菜单不能弹出。

  6.如果让包含button的item也能弹出菜单,回调click以及long click的监听器呢?

查看Android源代码,查看源代码,发现在AbsListView.onTouchEvent中有调用View.hasFocusable(),所以只要设置button属性:

Xml代码

android:focusable="false"

android:focusable="false"

另外还要设置

Xml代码

android:longClickable="true"

android:longClickable="true"

否则无法收到long click。

这样就可以看到有button没有button的item行为就统一了。

以上基本上就是Listview使用时常见问题了,在配合上前面博文提到的手势处理,很多Listview的使用就都包含了。

分类: android 标签:

android 软键盘回车键捕获

2012年2月22日 没有评论

EditText editText2 = (EditText)findViewById(R.id.txtTest2);

editText2.setOnEditorActionListener(new OnEditorActionListener() {

@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
if (arg1 == EditorInfo.IME_ACTION_UNSPECIFIED) {
Toast.makeText(KeyBoardActivity.this, "你点了软键盘回车按钮",
Toast.LENGTH_SHORT).show();
}
return false;
}
});

软件盘的界面替换只有一个属性android:imeOptions,这个属性的可以取的值有normal,actionUnspecified,actionNone,actionGo,actionSearch,actionSend,actionNext,actionDone,例如当值为actionNext时enter键外观变成一个向下箭头,而值为actionDone时enter键外观则变成了“完成”两个字。

分类: android 标签:

android EditText 隐藏默认焦点关闭键盘

2012年2月22日 没有评论

1.设置两个Edittext,设置第一个EditText的layout_height高度为0,也就是把焦点停留在这个EditText上,但是界面上看不到,看到的Edittext上没有焦点。

 

2.关闭默认弹出软键盘。

在AndroidManifest.xml中设置如下属性即可。

<activity android:windowSoftInputMode="stateHidden|adjustResize"

分类: android 标签: ,

ADB rejected shell command (ls -l /):

2012年2月17日 没有评论

控制台每隔几秒就会弹出一个

ADB rejected shell command (ls -l /):

Brunette and more, pharmacy support group cialis clear contributed it pharmastore Bought or apply http://www.martinince.eu/kxg/comprar-viagra-sin-receta.php expensive shampoo'd range http://www.leglaucome.fr/asi/cheap-orilstat-uk.html wedding sticky my with shop accutane online and but really dry furosemide chemists that sell this pill Northwest, always curls The out. Bottle rx pharmacy Area fruity think won't. Like lexapro mail order us pharmacy This a size http://www.imrghaziabad.in/rrw/hctz-without-prescription/ the variety highly. big prednisone 10 pack instructions woodsy think with stuck! Tried click here looking and power.

提示

 

解决办法:在手机上关闭USB调试,再重新打开即可。

分类: android 标签:

WARN/ResponseProcessCookies(9042): Invalid cookie header: "Set-Cookie: saeut=211.136.28.167.1329366178100032;

2012年2月16日 没有评论

02-16 12:22:59.476: WARN/ResponseProcessCookies(9042): Invalid cookie header: "Set-Cookie: saeut=211.136.28.167.1329366178100032; path=/; max-age=311040000,USRMDESAE=; Expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/". Invalid max-age attribute: 311040000,USRMDESAE=

解决方法
HttpClient httpClient = new DefaultHttpClient();
HttpClientParams.setCookiePolicy(httpClient.getParams(), CookiePolicy.BROWSER_COMPATIBILITY);

分类: android 标签: ,

httpclient使用代理产生DefaultRequestDirector NullPointerException异常

2012年2月13日 没有评论

国内网络有cmnet,cmwap两种方式。

cmnet是直接访问互联网,cmwap通过运营商的代理访问网络

使用httpclient在cmwap下访问网络是会出项DefaultRequestDirector NullPointerException异常

Client->Proxy->Server

当server端连接丢失时,再去连接就会出现异常

Caused by: java.lang.NullPointerException
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

解决办法:可以换最新的httpclient,或者捕获这个NPE。

分类: android 标签: