存檔

‘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:[email protected]");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);

Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_EMAIL, "[email protected]");
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={"[email protected]"};
String[] ccs={"[email protected]"};
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 標簽:
网球冠军