Android开发Tips-1

打算记录一些自己在开发过程中遇到的一些技巧性代码,方便以后遇到相似功能时能够快速的找到,那就从这里开始吧。

1,如何截取当前屏幕(不包括当前ActivityTitle)并分享:

a,获取当前Activity的根视图:
 1 View rootView = getWindow().getDecorView().findViewById(android.R.id.content); 
或者:
 1 View rootView = findViewById(android.R.id.content); 
或者:
 1 View rootView = findViewById(android.R.id.content).getRootView(); 
关于android.R.id.content,开发者文档中并没有给予说明,但经过测试它应该是用来获取setContentView()中设置的View
b,截取当前根视图的屏幕:

1 public static Bitmap getScreenShot(View view) {
2     View screenView = view.getRootView();
3     screenView.setDrawingCacheEnabled(true);
4     Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
5     screenView.setDrawingCacheEnabled(false);
6     return bitmap;
7 }

getScreenShot

c,将当前屏幕的截屏保存至SDCard:

 1 private final static String dir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots";
 2 public static void store(Bitmap bm, String fileName){
 3     File dir = new File(dir);
 4     if(!dir.exists())
 5         dir.mkdirs();
 6     File file = new File(dir, fileName);
 7     try {
 8         FileOutputStream fOut = new FileOutputStream(file);
 9         bm.compress(Bitmap.CompressFormat.PNG, 85, fOut);
10         fOut.flush();
11         fOut.close();
12     } catch (Exception e) {
13         e.printStackTrace();
14     }
15 }

store(Bitmap bm, String fileName)

d,最后将该图片文件分享出来:

 1 private void shareImage(String file){
 2     Uri uri = Uri.fromFile(file);
 3     Intent intent = new Intent();
 4     intent.setAction(Intent.ACTION_SEND);
 5     intent.setType("image/*");
 6     intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
 7     intent.putExtra(android.content.Intent.EXTRA_TEXT, "");
 8     intent.putExtra(Intent.EXTRA_STREAM, uri);
 9     startActivity(Intent.createChooser(intent, "Share Screenshot"));
10 }

shareImage(String file)

2,如何对HTML5中的视频截图:

a,初始化WebView:

1 String webUrl = ...;
2 VideoView vv;
3 mWebView = (WebView) findViewById(R.id.webview);
4 mWebView.setWebChromeClient(chromeClient);
5 mWebView.setWebViewClient(wvClient);
6 mWebView.getSettings().setJavaScriptEnabled(true);
7 mWebView.getSettings().setPluginsEnabled(true);
8 mWebView.loadUrl(webUrl);

b,覆盖WebChromeClient中的onShowCustomView方法:

 1 @Override
 2 public void onShowCustomView(View view, CustomViewCallback callback) {
 3     super.onShowCustomView(view, callback);
 4     if (view instanceof FrameLayout){
 5         FrameLayout frame = (FrameLayout) view;
 6         if (frame.getFocusedChild() instanceof VideoView){
 7             vv = (VideoView) frame.getFocusedChild();
 8         }
 9     }
10 }

onShowCustomView(View view, CustomViewCallback callback)

c,截取VideoView中播放的视频内容:

1 private Bitmap capture(VideoView vv){
2     MediaMetadataRetriever rev = new MediaMetadataRetriever();
3     rev.setDataSource(this, uri);//this is a Context;
4     Bitmap bitmap = rev.getFrameAtTime(vv.getCurrentPosition() * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
5     return bitmap;
6 }

capture(VideoView vv)

d,如何还想将截屏幕保存或分享,请参见上面的代码示例.

3,如何动态获取保存在integer-array中的动态资源id?

a,在res/values/目录下创建arrays.xml文件,创建内容如下:

1 <integer-array name="frag_home_ids">
2     <item>@drawable/frag_home_credit_return_money</item>
3     <item>@drawable/frag_home_transfer</item>
4     <item>@drawable/frag_home_balance</item>
5     <item>@drawable/frag_home_charge</item>
6     <item>@drawable/frag_home_finance_cdd</item>
7     <item>@drawable/frag_home_finance_ybjr</item>
8     <item>@drawable/frag_home_more</item>
9 </integer-array>

arrays.xml

b,通过编码的方式获取integer-array中的资源id整型值:

1 TypedArray tArray = getResources().obtainTypedArray(R.array.frag_home_ids);
2 int count = tArray.length();
3 int[] ids = new int[count];
4 for (int i = 0; i < ids.length; i++) {
5     ids[i] = tArray.getResourceId(i, 0);
6 }

c,使用已经获取到的资源的id:
 1 holder.iv.setImageResource(ids[position]); 
d,我们也还可以用这种方式获取stringcolorintegerlayoutmenu等的id.

4,ListViewGridView局部刷新原理的实现:

 1 private void refreshPartially(int position){
 2     int firstVisiblePosition = listview.getFirstVisiblePosition();
 3     int lastVisiblePosition = listview.getLastVisiblePosition();
 4     if(position>=firstVisiblePosition && position<=lastVisiblePosition){
 5         View view = listview.getChildAt(position - firstVisiblePosition);
 6         if(view.getTag() instanceof ViewHolder){
 7             ViewHolder vh = (ViewHolder)view.getTag();
 8             //holder.play.setBackgroundResource(resId);//Do something here.
 9             ...
10         }
11     }
12 }

refreshPartially(int position)

5,Google Volley的单例模式实现:

 1 package me.pc.mobile.tv.util;
 2
 3 import android.content.Context;
 4 import android.graphics.Bitmap;
 5 import android.util.LruCache;
 6 import com.android.volley.RequestQueue;
 7 import com.android.volley.toolbox.ImageLoader;
 8 import com.android.volley.toolbox.Volley;
 9
10 public class VolleySingleton {
11     private static VolleySingleton instance;
12     private RequestQueue requestQueue;
13     private ImageLoader imageLoader;
14     private VolleySingleton(Context context) {
15         requestQueue = Volley.newRequestQueue(context);
16         imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
17             private final LruCache<string, bitmap=""> cache = new LruCache<string, bitmap="">(20);
18
19             @Override
20             public Bitmap getBitmap(String url) {
21                 return cache.get(url);
22             }
23
24             @Override
25             public void putBitmap(String url, Bitmap bitmap) {
26                 cache.put(url, bitmap);
27             }
28         });
29         }
30
31     public static VolleySingleton getInstance(Context context) {
32         if (instance == null) {
33             instance = new VolleySingleton(context);
34         }
35         return instance;
36     }
37
38     public RequestQueue getRequestQueue() {
39         return requestQueue;
40     }
41
42     public ImageLoader getImageLoader() {
43         return imageLoader;
44     }
45 }

VolleySingleton.java

采用Volley的单例模式,就避免了在每一个ActivityFrament中都创建一个RequestQueue的麻烦.

6,使用Google Volley来实现文件的分块上传:

 1 public class PhotoMultipartRequest extends Request {
 2
 3     private static final String FILE_PART_NAME = "file";
 4
 5     private MultipartEntityBuilder mBuilder = MultipartEntityBuilder.create();
 6     private final Response.Listener mListener;
 7     private final File mImageFile;
 8     protected Map<string, string=""> headers;
 9
10     public PhotoMultipartRequest(String url, ErrorListener errorListener, Listener listener, File imageFile){
11         super(Method.POST, url, errorListener);
12
13         mListener = listener;
14         mImageFile = imageFile;
15
16         buildMultipartEntity();
17     }
18
19     @Override
20     public Map<string, string=""> getHeaders() throws AuthFailureError {
21         Map<string, string=""> headers = super.getHeaders();
22
23         if (headers == null || headers.equals(Collections.emptyMap())) {
24             headers = new HashMap<string, string="">();
25         }
26
27         headers.put("Accept", "application/json");
28
29         return headers;
30     }
31
32     private void buildMultipartEntity(){
33         mBuilder.addBinaryBody(FILE_PART_NAME, mImageFile, ContentType.create("image/jpeg"), mImageFile.getName());
34         mBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
35          mBuilder.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8"));
36     }
37
38     @Override
39     public String getBodyContentType(){
40         String contentTypeHeader = mBuilder.build().getContentType().getValue();
41         return contentTypeHeader;
42     }
43
44     @Override
45     public byte[] getBody() throws AuthFailureError{
46         ByteArrayOutputStream bos = new ByteArrayOutputStream();
47         try {
48             mBuilder.build().writeTo(bos);
49         } catch (IOException e) {
50             VolleyLog.e("IOException writing to ByteArrayOutputStream bos, building the multipart request.");
51         }
52
53         return bos.toByteArray();
54     }
55
56     @Override
57     protected Response parseNetworkResponse(NetworkResponse response) {
58         T result = null;
59         return Response.success(result, HttpHeaderParser.parseCacheHeaders(response));
60     }
61
62     @Override
63     protected void deliverResponse(T response) {
64         mListener.onResponse(response);
65     }
66 }            

PhotoMultipartRequest.java

代码中使用了Apachehttpclient.jar文件,用于实现文件的拆分与上传.

点击查看原文.

时间: 2024-10-14 04:28:20

Android开发Tips-1的相关文章

Android开发Tips

欢迎Follow我的GitHub, 关注我的CSDN. 介绍一些, 在Android开发中, 会经常使用的小知识点. 1. Download文件夹 绝对路径 /storage/emulated/0/Download/xxx 遍历 File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File[] files = file.listFiles(); for (int i

Android开发Tips(2)

欢迎Follow我的GitHub, 关注我的CSDN. 我会介绍关于Android的一些有趣的小知识点. 上一篇. 1. Dagger2的开发顺序 Module -> Component -> Application 首先模块(Module)创建须要提供的类实例, 其次把模块加入到组件(Component)中并提供须要注入的类, 最后把组件加入到应用(Application)中并提供接口. // 模块 @Module public class TestAppModule { private f

Android开发Tips(3)

欢迎Follow我的GitHub, 关注我的CSDN. 我会介绍关于Android的一些有趣的小知识点. 本文是第三篇, 其余第一篇, 第二篇. 1. UIAutomatorViewer 自动化测试是Android测试的趋势, 稳定\复用, 最常用的工具就是Espresso. 使用UIAutomatorViewer获取资源的Id, 位置/android-sdk/tools/uiautomatorviewer, 点击即可使用. 2. GitHub标签 网址, 比如: 3. 有趣的修改SVG库 地址

如何紧跟android开发的潮流

title: 如何紧跟android开发的潮流 date: 2015-08-26 20:53:39 categories: 翻译 文章出处:转载自 微凉一季 的blog,转载注明出处 而且 本文翻译来自外文 今天看了篇文章,开发如何跟上发展的潮流,跟我的感受不谋而合,故整理翻译一下,以飨他人. android在世界上发展的非常迅猛,作为一个android 开发者,很重要的一件事就是要跟上前沿潮流,每次主要的发布都带来一堆新特性,工具不断改善,每周都有新lib的不断诞生,每天都有不错的博客帖子发布

Android 开发最佳实践

从Futurice公司Android开发者中学到的经验. 遵循以下准则,避免重复发明轮子.若您对开发iOS或Windows Phone 有兴趣, 请看iOS Good Practices 和 Windows client Good Practices 这两篇文章.摘要 ??? 使用 Gradle 和它推荐的工程结构??? 把密码和敏感数据放在gradle.properties??? 不要自己写 HTTP 客户端,使用Volley或OkHttp库??? 使用Jackson库解析JSON数据???

Android开发学习---使用Intelij idea 13.1 进行android 开发

原文:Android开发学习---使用Intelij idea 13.1 进行android 开发 1.为什么放弃eclipse?太卡!! 实在受不了eclipse的卡了,运行WEB项目还好,但android开发实在太慢,太慢!经常卡死,CPU经常被占满! 看网上很多人都说比Intelij idea好用,就试下,目前还在test阶段,总之是各种不习惯,很多快捷键之类的跟eclipse完全不一样.还要多熟悉! 另外android studio 也比较卡,而且用起来相当难受,完全是intelij 的

Android开发性能优化总结(一)

安卓开发应用首先要讲究良好的用户体验,如果一款软件卡顿现象严重,不流畅,经常崩溃,那么将给用户带来极不良好的体验,从而损失用户. 在实际开发和学习中,我总结了一下关于安卓性能的优化,供大家参考交流. 应用程序的性能问题体现在很多方面, 比如第一次启动速度慢,或者进入某一界面速度慢:动画执行过程不流畅,或者动画执行卡顿时间长:ListView列表滑动过程中卡顿,不流畅:应用程序自定义的某特定界面执行速度慢:响应某一用户事件时长时间无响应(ANR):操作数据库时,执行大量数据的增删改查操作,执行速度

Android开发人员必知的开发资源

developer.android.com 官方开发人员网站推荐资源 在动手编写第一个 Android 应用之前,用心读一读 Android Design 章节.尤其是以下的这些文章: Devices and Displays  (设备和显示) Touch Feedback(触摸反馈) Metrics and Grids (度量和网格) Iconography (图像研究) 同一时候也请下载 Downloads 部分的代码,这些代码囊括了 Android 图标和控件的设计模板,源文件.样式以及无

[Xamarin.Android] Fragment Tips

[Xamarin.Android] Fragment Tips Fragment用途 快速搞懂 Fragment的用途,可以参考下列文章: Android Fragment 使用心得 Android 3.0之前版本加入Fragment 因为在Android 3.0之后,才支持Fragment功能.所以在Xamarin中要开发3.0之前版本的APP,依照下列文章的步骤,就可以在APP中使用Fragment功能: Supporting pre-Honeycomb Android using Supp

android开发开源宝贝——持续更新。。。

2016年11月11日更新 http://www.apkbus.com/forum-417-1.html http://p.codekk.com/detail/Android/hejunlin2013/LivePlayback www.codekk.com https://github.com/Trinea/android-open-project Android 开源项目分类汇总 我们的微信公众号:codekk.二维码如下: 专注于 Android 开源分享.源码解析.框架设计.Android