Android开发问题

954.上传文件的时候获得文件的MIME content-type

1.得到文件的MIME content-type类型
mime-util-2.1.3.jar
slf4j-api-1.7.5.jar
slf4j-nop-1.7.5.jar

e.g.
File f = new File("d:\\new_ailise.png");
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
Collection<?> mimeTypes = MimeUtil.getMimeTypes(f);
System.out.println(mimeTypes);

2.JAVA自带,类型不全

   //得到文件的content-type
//   String ct = new MimetypesFileTypeMap().getContentType(f);
//   System.out.println(ct);

3.使用JMimeMagic

jmimemagic-0.1.0.jar

Magic parser = new Magic() ;
// getMagicMatch accepts Files or byte[],
// which is nice if you want to test streams
MagicMatch match = parser.getMagicMatch(new File("gumby.gif"));
System.out.println(match.getMimeType()) ;

参考:http://blog.csdn.net/chaijunkun/article/details/7046343


955.如何对singleInstance的Activity多次传入Intent

问题出现的情况,服务向android:launchMode="singleInstance"的activity传递数据的时候,Intent的数据总是旧数据(第一次传递过去的数据)

override onNewIntent(Intent intent)方法,setIntent(intent),解决了问题。

感谢作者。以下内容参考http://blog.csdn.net/wchinaw/article/details/6563384

在作Notification传Intent数据给Activity时,此Activity为singleInstance

AndroidManifest.xml: activity属性:

android:launchMode="singleInstance",

在onResume中无法获取传入的Intent,原来用getIntent()只能获取Activity原来的Intent.

有此方法可以让singleInstance的Activity获取传入的Intent,并获取Extra数据:

重载:

onNewIntent(Intent intent) ,即可。

956.Android打包成APK

包名相同,签名相同。安装提示是否替换

包名相同,签名不同。无法安装,提示[INSTALL_FAILED_ALREADY_EXISTS]

包名不同,签名相同。可以安装。

957.Android按返回键退出程序但不销毁,同QQ退出处理方式@Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_BACK) {
   moveTaskToBack(false);
   return true;
  }
  return super.onKeyDown(keyCode, event);
 }

里面的moveTaskToBack()是关键

958.Android decode后重新build958.1提示invalid resource values-300w之类的

更换一个新的aapt.exe后成功。

E:\apktool>apktool.bat b f:\temp g:\hello.apk
I: Checking whether sources has changed...
I: Checking whether resources has changed...
I: Building resources...
I: Building apk file...

958.2安装的时候提示Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

貌似缺少签名

959.drawninepatch用法

drawninepatch的左边和上边控制拉伸区域,右边和下边控制内容区域

960.gallery选中项高亮,没选中的项会覆盖阴影,怎样去掉阴影?

gallery.setUnselectedAlpha();参数透明即可解决问题。从eoe上看到的。解决了困扰我很久的问题。

961.viewpager无限大滑动,向回来的方向滑动会有黑屏

 viewPager.setCurrentItem(0);
 viewPager.setOffscreenPageLimit(1);// 预加载

测试发现根本不管用

962.android在代码中直接设置View的layout_weight,margin属性

tvColu2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1.0f));

 

android 用代码设置margin属性,textView加粗

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(2, 2, 2, 2);
        
view.setLayoutParams(lp);

textview字体加粗

textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));//加粗

textView.getPaint().setFakeBoldText(true);//加粗

设置字体样式http://www.2cto.com/kf/201204/128446.html

963.在Eclipse中查看android源代码

比如4.0的,将下载的源代码解压后放入android-sdk的路径里面platforms\android-14\sources\下面即可在Eclipse里面按住ctrl查看了。sources文件夹需要创建,里面是一堆android的源代码文件夹

964.android 获得当前view在屏幕的坐标

getX(),getY()方法在2.3Gingerbread才支持。

[java] view plain copy print ?
  1. final int[] location = new int[2];  
  2. view.getLocationOnScreen(location);  

这样就可以得到该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标。

比如可以在适当的位置做一些比如弹出窗口的操作,可以使用到。

965.关于关闭一个应用程序

http://stackoverflow.com/questions/3279578/close-android-application

967.What is a cheek press event?

PopupWindow里面的一个事件。详情参考:http://stackoverflow.com/questions/10840884/what-is-a-cheek-press-event

968.android中Bitmap和二进制形式数据的互相转换

有一个将Bitmap转换成二进制数据的需求,发现两者可互转。

http://www.189works.com/article-17853-1.html

969.android下载文件进阶

https://github.com/openproject/world2/blob/master/baseworld2/src/com/tianxia/lib/baseworld2/upgrade/AppUpgradeService.java

970.android文件和文件的MIME类型

http://www.cnblogs.com/hibraincol/archive/2010/09/16/1828502.html

971.Android下载进度到通知栏

不足之处是缺一个进度条

参考http://blog.csdn.net/abc13939746593/article/details/8160883

972.SD卡操作

注意权限的添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

判断SD卡是否存在,查看SD卡的容量等。

两个重要的类Environment和StatFs

http://www.oschina.net/question/54100_33506

973.启动其他应用

一种方法是得到其他应用的包名和入口activity的名字。不过有时候难以做到得到activity的名字。

另一种方法是使用PackageManager中的

publicabstract Intent getLaunchIntentForPackage(String packageName)

可以得到一个已知包名应用的入口Intent,即可启动应用。

974.android录制音频

android实现音频的录制方法,目前了解的有两种

第一种是使用AudioRecord类,AudioTrack播放,但是这个类没有找到设置输出文件格式的方法。

第二种是使用MediaRecorder类,MediaPlayer播放,一个常见的用法如下代码所示

[java] view plain copy print ?
  1. MediaRecorder recorder = new MediaRecorder();  
  2.  recorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
  3.  recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
  4.  recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
  5.  recorder.setOutputFile(PATH_NAME);  
  6.  recorder.prepare();  
  7.  recorder.start();   // Recording is now started  
  8.  ...  
  9.  recorder.stop();  
  10.  recorder.reset();   // You can reuse the object by going back to setAudioSource() step  
  11.  recorder.release(); // Now the object cannot be reused  

974.1遇到的问题1

检测和录制都要用microphone麦克风,录制的时候还要检测是否符合停止条件以便停止录制。

这个逻辑目前是这样:

程序启动后即开始检测,当检测到声音大小符合条件就开始录制,检测也还在进行,当检测到声音大小不再符合条件就停止录制,最后播放录制好的音频。

很显然这样会出问题,因为麦克风只有一个,非常的纠结,不知道使用异步能不能解决这个问题,试试。

白噪声的问题white noise

关于计算机对声音的处理还有很多要学习的东西,现在只是站在巨人的肩膀上直接调用方法,原理需要明白。

975.android实现tom猫的学说话

录音然后回放OK

汤姆猫的声音改变原理
改变声音的pitch(音高),在网上搜索了一下有个人已经写过demo了
http://purplelilgirl.tumblr.com/post/9377269385/making-that-talking-app
不过是ios版本的,利用了cocos2d的声音引擎sound engine。
声音还有个重要属性tempo(节奏/音乐速度)

判断声音大小来决定说话是否结束?

参考http://blog.csdn.net/li_guotao/article/details/7078126

Audio data format:PCM16bit和PCM8bit什么区别?

声音用计算机处理需要经过采样、量化和编码。Analog 2 Digital

976.android触摸事件

onInterceptTouchEvent和onTouchEvent今天学习了一下,参考了http://blog.csdn.net/Android_Tutor/article/details/7193090

 

977.android判断手机是否root

关于判断手机是否已经root的方法。如果app有一些特殊功能需要root权限,则需要判断是否root。比如一些市场下载完app后自动安装。

[java] view plain copy print ?
  1. /** 
  2.  * @author Kevin Kowalewski 
  3.  *  
  4.  */  
  5. public class Root {  
  6.   
  7.     private static String LOG_TAG = Root.class.getName();  
  8.   
  9.     public boolean isDeviceRooted() {  
  10.         if (checkRootMethod1()){return true;}  
  11.         if (checkRootMethod2()){return true;}  
  12.         if (checkRootMethod3()){return true;}  
  13.         return false;  
  14.     }  
  15.   
  16.     public boolean checkRootMethod1(){  
  17.         String buildTags = android.os.Build.TAGS;  
  18.   
  19.         if (buildTags != null && buildTags.contains("test-keys")) {  
  20.             return true;  
  21.         }  
  22.         return false;  
  23.     }  
  24.   
  25.     public boolean checkRootMethod2(){  
  26.         try {  
  27.             File file = new File("/system/app/Superuser.apk");  
  28.             if (file.exists()) {  
  29.                 return true;  
  30.             }  
  31.         } catch (Exception e) { }  
  32.   
  33.         return false;  
  34.     }  
  35.   
  36.     public boolean checkRootMethod3() {  
  37.         if (new ExecShell().executeCommand(SHELL_CMD.check_su_binary) != null){  
  38.             return true;  
  39.         }else{  
  40.             return false;  
  41.         }  
  42.     }  
  43. }  
  44.   
  45.   
  46. /** 
  47.  * @author Kevin Kowalewski 
  48.  * 
  49.  */  
  50. public class ExecShell {  
  51.   
  52.     private static String LOG_TAG = ExecShell.class.getName();  
  53.   
  54.     public static enum SHELL_CMD {  
  55.         check_su_binary(new String[] {"/system/xbin/which","su"}),  
  56.         ;  
  57.   
  58.         String[] command;  
  59.   
  60.         SHELL_CMD(String[] command){  
  61.             this.command = command;  
  62.         }  
  63.     }  
  64.   
  65.     public ArrayList<String> executeCommand(SHELL_CMD shellCmd){  
  66.         String line = null;  
  67.         ArrayList<String> fullResponse = new ArrayList<String>();  
  68.         Process localProcess = null;  
  69.   
  70.         try {  
  71.             localProcess = Runtime.getRuntime().exec(shellCmd.command);  
  72.         } catch (Exception e) {  
  73.             return null;  
  74.             //e.printStackTrace();  
  75.         }  
  76.   
  77.         BufferedWriter out = new BufferedWriter(new OutputStreamWriter(localProcess.getOutputStream()));  
  78.         BufferedReader in = new BufferedReader(new InputStreamReader(localProcess.getInputStream()));  
  79.   
  80.         try {  
  81.             while ((line = in.readLine()) != null) {  
  82.                 Log.d(LOG_TAG, "--> Line received: " + line);  
  83.                 fullResponse.add(line);  
  84.             }  
  85.         } catch (Exception e) {  
  86.             e.printStackTrace();  
  87.         }  
  88.   
  89.         Log.d(LOG_TAG, "--> Full response was: " + fullResponse);  
  90.   
  91.         return fullResponse;  
  92.     }  
  93.   
  94. }  

代码来自stackoverflow,向作者致敬。

方法2:

The RootTools library offers simple methods to check for root:

一个开源项目:http://code.google.com/p/roottools/

RootTools.isRootAvailable()判断是否root

RootTools.isAccessGiven()返回true那么手机已经root并且app也被授予root权限。

另外:据那片帖子的一个回贴人说使用

[java] view plain copy print ?
  1. String commandToExecute = "su";  
  2. executeShellCommand(commandToExecute);  
  3. private boolean executeShellCommand(String command){  
  4.     Process process = null;              
  5.     try{  
  6.         process = Runtime.getRuntime().exec(command);  
  7.         return true;  
  8.     } catch (Exception e) {  
  9.         return false;  
  10.     } finally{  
  11.         if(process != null){  
  12.             try{  
  13.                 process.destroy();  
  14.             }catch (Exception e) {  
  15.             }  
  16.         }  
  17.     }  
  18. }  

会引起非常严重的性能问题,将手机系统拖的非常慢,当应用多次启动后会创建出很多个僵死的进程耗用内存。
参考http://stackoverflow.com/questions/1101380/determine-if-running-on-a-rooted-device

To sum up; I have no advice for you to determine if device is rooted or not. But if I were you I would not use Runtime.getRuntime().exec().

By the way; RootTools.isRootAvailable() causes same problem.
The RootTools library offers simple methods to check for root:

978.android国行手机杯具

今天做一个TextToSpeech模拟器正常播放声音,手机上提示Language is not supported!换了个HTC一试,木问题,看来国行被咔嚓了这个功能。

先用一个叫xshortcut的应用设置了一下,具体搜索一下吧。

然后我安装这个应用后可以发音了,com.svox.langpack.installer_1.0.1.apk

不能登录google账号。

979.获取Android手机的各种唯一标志

IMEI,IMSI,ANDROID_ID,mac

980.提取模拟器中的DevTools apk

adb -e pull /system/app/Development.apk ./Development.apk  --linux

adb -e pull /system/app/Development.apk  d:\Development.apk  --windows

981.Android应用分享功能

http://blog.csdn.net/gsg8709/article/details/7326854      分享功能,只用了一个方法就搞定了,估计功能有限。

982.导入API demo资源文件报错

新建Android项目from existing code--->到Android SDK目录找到samples选择一个Android版本文件夹-->ApiDemos

导入。注意导入之后,对应的Android library的版本要与倒入时候选择的一致。比如在samples选择androi-8,Android library一定是2.2。否则可能报错。

983.error: more than one device and emulator

查看已连接的设备

adb devices

选择你要使用的设备

adb -s 设备名称 shell

命令行安装apk的时候如果手机和模拟器都已经连接调试,安装就会出这个提示。

此时可以输入adb -s 设备名称 install *.apk即可安装到指定设备。

984.启动其他应用中的activity的问题

在启动其他应用中的activity时出现如下错误

AndroidRuntime(3210):

java.lang.SecurityException: Permission Denial:

starting Intent { cmp=com.zgst.mobilelife.ui/.MainActivity } from ProcessRecord{407c9a08 3210:com.bzu.learn/10038} (pid=3210, uid=10038) requires null

不过启动其他应用中的入口activity的时候是正常的。

上网查了一下原来activity中要定义intent-filter后才可以被其他应用启动。经验证,确实是这样。

 

985.模拟器与adb断开,在DDMS里面看不到

进入cmd执行

adb kill-server

adb start-server

986.根据经纬度获取所在城市位置

http://maps.google.com/maps/geo?q=35.756041,115.986939&output=csv&sensor=false
我来晚了,以上这个地址是根据经纬度获取所在城市名称的,经纬度我自己随便写的,有一个问题请教各位前辈名宿,这个URL粘贴到浏览器里面访问,返回的是中文地名,但是在Eclipse里面自己写程序获取到的却是英文地名。不知道怎么解决?还望各位不吝赐教,非常感谢。add User-Agent property to message header!

987.Android混淆文件中要注意排除第三方jar包

使用百度地图开发的程序,运行到手机没有问题。但是签名打包成apk的时候安装到手机上,到百度地图页面,程序就自动退出,纠结了几天才知道是混淆以后jar包的内容无法识别 ,所以要在混淆的时候把jar排除
。后来在混淆文件中加上排除百度的jar语句就好了。感谢xiaochen微笑。具体参考http://www.dewen.org/q/3031

988.ActionBarSherlock让所有actionbar上的action item直接进入overflow

默认是有条目以action图标的形式显示在actionbar上,显示不了的进入overflow。设置属性ShowAsAction

setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);即可让所有action item进入overflow

 

989.改变spinner弹出窗口的宽度

改变spinner弹出的窗口的的宽度。待解决

990.二维码的生成与识别

网上有个开源的库zxing https://zxing.googlecode.com/files/ZXing-2.1.zip

识别二维码的时候照相机容易对不准,上下左右完全颠倒。不知道为什么。原因在Manifest.xml文件中orientation错了。生成二维码是否需要联网?

991.包中的activity的声明问题

在项目中创建了一个和开始创建的包平行的包,里面有个activity,声明的时候在Manifest.xml里面写上完整的包名,前面不要加点,否则会认为是原来包里面的子包。

992.Android获取GPS位置经度longitude纬度latidude

[java] view plain copy print ?
  1. LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);  
  2.   locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 00new MyLocationListener());  
  3. // listener类里面的重要方法  
  4. public void onLocationChanged(Location location) {  
  5.    System.out.println(location.getLongitude());  
  6.    System.out.println(location.getLatitude());  
  7.    tvLocation.append("longitude:"+location.getLongitude()+"-"+"latitude:"+location.getLatitude()+"\n");  
  8.   }  


在室内无法获取到经纬度,拿到窗户边打开窗户试试。

993.关于HTTP的get请求方式

Java和Apache都分别提供了相应的类来完成get请求,如果Java提供的get方式请求得到的json数据某些key的值为空,不妨试试Apache提供的方式。

 

994.ListView中只有3个item,可是getView方法却run了十几次log如下:为什么会这样呢?

01-30 16:33:39.755: D/AppMenuAdapter(7378):  positions- 0
01-30 16:33:39.765: D/AppMenuAdapter(7378):  convertView- if
01-30 16:33:39.765: D/AppMenuAdapter(7378):  positions- 1
01-30 16:33:39.765: D/AppMenuAdapter(7378):  convertView- else
01-30 16:33:39.765: D/AppMenuAdapter(7378):  positions- 2
01-30 16:33:39.765: D/AppMenuAdapter(7378):  convertView- else
01-30 16:33:39.795: D/AppMenuAdapter(7378):  positions- 0
01-30 16:33:39.795: D/AppMenuAdapter(7378):  convertView- else

995.ListView加载图片闪烁的问题

从网上看到一篇文章,讲的真好。地址:http://www.cnblogs.com/liongname/articles/2345087.html

原因是ImageView在set图片的时候,不管是不是它要展示的图片,都要set一下,于是图片因替换而产生闪烁现象正是看这篇文章解决了问题,也这样想过,但没实践。另外用线程池可以更节省内存。

995.1新的问题:ListView使用converView和以上方法优化后,每一屏的内容重复

当滚动到第二屏的时候,第二屏的第一个item和第一屏的第一个item的内容重复了,同样第三屏等相应位置item内容也重复了。当内容完全加载完毕的时候这种现象就少了,但还是有,如何彻底解决呢?

996.ListView显示的图片变小

网络图片的大小是72 * 72,从网络取回放到ListView上却成为了48 * 48,困惑!

R: 已解决。imageView.setImageDrawable(drawable);//原来把Bitmap转换成Drawable图片就变小了1.5倍后来用imageView.setImageBitmap(bm);就不变小了。

(小问题,ListView的图片没有自动刷新,后来发现在回调接口实现类中把ImageView定义成static造成的)

997.android权限的使用

<uses-permission android:name="android.permission.VIBRATE" /><!-- 震动权限 -->

<uses-permission android:name="android.permission.INTERNET"/><!-- 访问网络权限 -->

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><!-- 访问网络状态权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 操作SD卡权限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 删除文件权限 -->

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/><!-- 禁用锁屏 -->
 <uses-permission android:name="android.permission.WAKE_LOCK"/><!-- 点亮屏幕 -->

998.android开发中资源文件中view的id命名

是不是一定要保证不重复,有没有可以重复的情况。997.1保证不重复    997.2如果有重复,要保证不引起混淆。API:View IDs need not be unique throughout the tree, but it is good practice to ensure that they are at least unique within the part of the tree you are searching.998.ActionBar是从3.0以后提供的一个view组件,http://actionbarsherlock.com/usage.html提供了一个可以在2.*上使用ActionBar的包。

999.人人网应用的主页面、Adobe Reader的主界面,都有左右推拉的效果

现在豌豆荚最新版本3.16.1.3594也是这种左右推拉风格。不得不说这种风格的应用可以容纳更多的操作模块,用户体验也会好很多,但是这是怎么实现的?

R:  用HorizontalScrollView实现!自定义控件继承View,已经实现了左右推拉的效果。自定义HSV中放入了两个View一个是透明的,当向右滚动时透明view就滚动到主屏,可以显示下面的操作菜单。999.1新问题但是透明view后面的操作菜单却无法响应touch事件,是个问题R: 解决:menuList.dispatchTouchEvent(event);// 将touch事件传递给后面的菜单列表 

1000. 程序在模拟器上正常运行,在真机上没能正常运行,无法从网络获取数据

系统版本Android2.3.4不知道什么原因。其他平台没有测试。1000.1使用WLAN是可以获取到数据的,2G卡的流量却得不到数据。迷惑!

你可能感兴趣的:(android)