Android开发实用代码片段(一)

Canvas开篇之drawBitmap方法讲解 前面讲了paint,后面会花几篇主要讲讲canvas,并且由于最近项目比较紧,所以近期的文章都会“短小精悍”; paint 作为画笔,里面有非常多而强大的设置方法,比如设置颜色过滤器,设置位图渲染、渐变,设置图像的混合模式等等,而canvas呢?里面提供了哪些利器可以为我们所用,一起来看看: 通过上图我们可以看到,canvas 里的方法基本可以分为这么几类: 1. save、restore 等与层的保存和回滚相关的方法; 2. scale、rotate、clipXXX 等对画布进行操作的方法; 3. dra 阅读详情

由于在开发中,常常会用到小功能或者属性或设置等,这些呢,我们也不会去记,经常去百度,但是过了段时间后呢,还是很容易忘记,又得去查。所以我决定了,以后对一些小代码段,收集记录下来,以备后用,所以此文会不断更新。

1.获取设备屏幕宽高

网络上代码段通常是这样的:

WindowManager wm = (WindowManager) getContext()
                    .getSystemService(Context.WINDOW_SERVICE);
 
     int width = wm.getDefaultDisplay().getWidth();
     int height = wm.getDefaultDisplay().getHeight();
或者

WindowManager wm = this.getWindowManager();
 
     int width = wm.getDefaultDisplay().getWidth();
     int height = wm.getDefaultDisplay().getHeight();

但是现在系统会提示我们,不建议使用类型Display的方法getHeight/getWidth。

所以我们可以使用下面的方法

public class MeasureUtil {
	public static int getScreenWidth(Context mContext) {
		int width = mContext.getResources().getDisplayMetrics().widthPixels;
		return width;
	}
	public static int getScreenHeight(Context mContext) {
		int height = mContext.getResources().getDisplayMetrics().heightPixels;
		return height;
	}
}

ps,通过getDisplayMetrics类,我们还可以获取一些其他的屏幕信息

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        float density = displayMetrics.density; //屏幕密度
        int densityDpi = displayMetrics.densityDpi;//屏幕密度dpi
        int heightPixels = displayMetrics.heightPixels;//屏幕高度的像素
        int widthPixels = displayMetrics.widthPixels;//屏幕宽度的像素
        float scaledDensity = displayMetrics.scaledDensity;//字体的放大系数
        float xdpi = displayMetrics.xdpi;//宽度方向上的dpi
        float ydpi = displayMetrics.ydpi;//高度方向上的dpi

2.Dip和Px的相互转换

先讲下dip和px的区别吧

        dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。 
    这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480*800,但是屏幕密度没有正确设置比如说还是160,那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。 
     dip的换算: 
           dip(value)=(int) (px(value)/1.5 + 0.5) 

px: pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。

下面举个例子区别px和dip:
px就是像素,如果用px,就会用实际像素画,举个栗子,用画一条长度为240px的横线,在480分辨率宽的模拟器上看就是一半的屏宽,而在320分辨率宽的模拟器上看就是2/3的屏宽了。
而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。

其实在安卓中,将屏幕密度为160dpi的中密度设备屏幕作为基准屏幕,在这个屏幕中,1dp=1px。其他屏幕密度的设备按照比例换算,具体如下表:


由上表不难计算1dp在hdpi设备下等于1.5px,同样的在xxhdpi设备下1dp=3px。这里我们从dp到px解释了Android中不同屏幕密度之间的像素比例关系。

/**
 * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
 */
public static int dip2px(Context context, float dpValue) {
 final float scale = context.getResources().getDisplayMetrics().density;
 return (int) (dpValue * scale + 0.5f);
}

/**
 * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
 */
public static int px2dip(Context context, float pxValue) {
 final float scale = context.getResources().getDisplayMetrics().density;
 return (int) (pxValue / scale + 0.5f);
}

说个题外话,在我们设计UI图片时,图片资源应该尽量放在高密度文件夹下,这样可以节省图片的内存开支,而UI在设计图片的时候也应该尽量面向高密度屏幕的设备来进行设计。就目前来讲,最佳放置图片资源的文件夹就是drawable-xxhdpi。参考链接Android drawable微技巧,你所不知道的drawable的那些细节。

3.更改Toast显示位置的技巧

在Android中,如果开发者需要通知用户发生了什么事,一般我们会选择Toast这个类,但是Toast的显示位置总是在同一个地方,不是很灵活,其实我们可以根据应用程序的布局不同,可以自由的显示Toast的位置。


要显示下图中Toast的显示位置,我们可以通过下面的代码来实现

setGravity(int gravity, int xOffset, int yOffset)

Toast toast = Toast.makeText(this, "我是一个Toast", Toast.LENGTH_LONG);
		toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 100);
		toast.show();
4.ScrollView嵌套ListView,滑动事件冲突解决方案
public class ListViewNoScroll extends ListView {  
    public ListViewNoScroll(Context context) {  
        super(context);  
    }  
  
    public ListViewNoScroll(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    @Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
                MeasureSpec.AT_MOST);  
        super.onMeasure(widthMeasureSpec, expandSpec);  
    }  
  
}  
5.获取指定目录的文件夹下的所有文件名

主要是利用了递归算法

/**
     * @param path
     *            文件路径
     * @param suffix
     *            后缀名, 为空则表示所有文件
     * @param isdepth
     *            是否遍历子目录
     * @return list
     */
    public static List<String> getListFiles(String path, String suffix, boolean isdepth) {
        List<String> lstFileNames = new ArrayList<String>();
        File file = new File(path);
        return MyTest.listFile(lstFileNames, file, suffix, isdepth);
    }

    private static List<String> listFile(List<String> lstFileNames, File f, String suffix, boolean isdepth) {
        // 若是目录, 采用递归的方法遍历子目录
        if (f.isDirectory()) {
            File[] t = f.listFiles();

            for (int i = 0; i < t.length; i++) {
                if (isdepth || t[i].isFile()) {
                    listFile(lstFileNames, t[i], suffix, isdepth);
                }
            }
        } else {
            String filePath = f.getAbsolutePath();
            if (!suffix.equals("")) {
                int begIndex = filePath.lastIndexOf("."); // 最后一个.(即后缀名前面的.)的索引
                String tempsuffix = "";

                if (begIndex != -1) {
                    tempsuffix = filePath.substring(begIndex + 1, filePath.length());
                    if (tempsuffix.equals(suffix)) {
                        lstFileNames.add(filePath);
                    }
                }
            } else {
                lstFileNames.add(filePath);
            }
        }
        return lstFileNames;
    }

6.context.getExternalFilesDir()和context.getExternalCacheDir()方法

应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。

大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。
这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。
如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?

通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。

而且上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项。所以重要的,需要长期保存的文件不要放在此处。

/**
     * 获取Temp目录
     * @param context
     * @return
     */
    public static String GetTempFileSavePath(Context context)
    {
        if(context==null)
        {
            return "";
        }
        String strTempPath = "";
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
                || !Environment.isExternalStorageRemovable())
        {
            strTempPath = String.valueOf(context.getExternalCacheDir());
        }
        else
        {
            strTempPath = String.valueOf(context.getCacheDir());
        }

        if(strTempPath.equalsIgnoreCase("null"))
        {
            strTempPath = String.valueOf(context.getCacheDir());
        }
        if (!strTempPath.endsWith("/"))
        {
            strTempPath += "/";
        }

        File file = new File(strTempPath);
        if (!file.exists())
        {
            file.mkdirs();
        }
        return strTempPath;
    }

获取sd卡路径

 /**
     *  Android SD卡路径
     */
    public String getSDPath(){
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState()
                .equals(Environment.MEDIA_MOUNTED);   //判断sd卡是否存在
        if   (sdCardExist)
        {
            sdDir = Environment.getExternalStorageDirectory();//获取根目录
        }
        return sdDir.toString();
    }
使用时:在后面加上斜杠,在加上文件名 
String fileName = getSDPath() +"/" + name;//以name存在目录中

注意添加权限

<!-- 在SDCard中创建与删除文件权限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!-- 往SDCard写入数据权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

假如出现以下错误

Android中的文件存储位置:java.io.FileNotFoundException: xxx: open failed: EROFS (Read-only file system)

保存文件时路径不对,貌似是少了个“/”。

最好用File fullFilename = new File(extDir, filename);  代替 File f2=new File(path);

7.对整个屏幕视图进行截屏并生成图片

Android中经常会遇到把View转换为Bitmap的情形,比如,对整个屏幕视图进行截屏并生成图片.

网上收集到有2种方法

 public static Bitmap convertViewToBitmap(View view, int bitmapWidth, int bitmapHeight){
        Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
        view.draw(new Canvas(bitmap));
        
        return bitmap;
    }
或者

public static Bitmap convertViewToBitmap(View view){
       view.buildDrawingCache();
    Bitmap bitmap = view.getDrawingCache();
    return bitmap; 
}
一般情况下,这2个方法能够正常的工作。但有时候,生成Bitmap会出现问题(Bitmap全黑色)。主要原因是 drawingCache的值大于系统给定的值。

较好的解决方案是

public static Bitmap convertViewToBitmap(View view){
      view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
        view.buildDrawingCache();
        Bitmap bitmap = view.getDrawingCache();

     return bitmap;
}
8.Android三种实现定时器的方法

方法一:Handler+Thread

import android.app.Activity;  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.Message;  
import android.widget.TextView;  
  
/** 
 * handler定时器 
 *  
 */  
public class HanderDemoActivity extends Activity {  
    TextView tvShow;  
    private int i = 0;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        tvShow = (TextView) findViewById(R.id.tv_show);  
        new Thread(new ThreadShow()).start();  
    }  
  
    // handler类接收数据  
    Handler handler = new Handler() {  
        public void handleMessage(Message msg) {  
            if (msg.what == 1) {  
                tvShow.setText(Integer.toString(i++));  
                System.out.println("receive....");  
            }  
        };  
    };  
  
    // 线程类  
    class ThreadShow implements Runnable {  
  
        @Override  
        public void run() {  
            // TODO Auto-generated method stub  
            while (true) {  
                try {  
                    Thread.sleep(1000);  
                    Message msg = new Message();  
                    msg.what = 1;  
                    handler.sendMessage(msg);  
                    System.out.println("send...");  
                } catch (Exception e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                    System.out.println("thread error...");  
                }  
            }  
        }  
    }  
}  
方法二:Handler类自带的postDelyed

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

/**
 * handler定时器使用postDelyed实现
 * 
 */
public class HanderDemoActivity extends Activity {
	TextView tvShow;
	private int i = 0;
	private int TIME = 1000;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		tvShow = (TextView) findViewById(R.id.tv_show);
		handler.postDelayed(runnable, TIME); //每隔1s执行
	}

	Handler handler = new Handler();
	Runnable runnable = new Runnable() {

		@Override
		public void run() {
			// handler自带方法实现定时器
			try {
				handler.postDelayed(this, TIME);
				tvShow.setText(Integer.toString(i++));
				System.out.println("do...");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("exception...");
			}
		}
	};

}
方法三:Handler+Timer+TimerTask
import java.util.Timer;  
import java.util.TimerTask;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.Message;  
import android.widget.TextView;  
  
/** 
 * 定时器实现:Handler+Timer+TimerTask 
 *  
 */  
public class HanderDemoActivity extends Activity {  
    TextView tvShow;  
    private int i = 0;  
    private int TIME = 1000;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        tvShow = (TextView) findViewById(R.id.tv_show);  
        timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行  
    }  
  
    Handler handler = new Handler() {  
        public void handleMessage(Message msg) {  
            if (msg.what == 1) {  
                tvShow.setText(Integer.toString(i++));  
            }  
            super.handleMessage(msg);  
        };  
    };  
    Timer timer = new Timer();  
    TimerTask task = new TimerTask() {  
  
        @Override  
        public void run() {  
            // 需要做的事:发送消息  
            Message message = new Message();  
            message.what = 1;  
            handler.sendMessage(message);  
        }  
    };  
}  
综合比较三种方法,推荐第二个。因为第一个Thread.sleep会占用线程资源,当Sleep的时候,就等于说:现在我不用,但是你也别想用。虽然没占用CPU资源,但是阻碍了线程的调度。第三个话,在run方法中会不断的new 对象,为了实现定时,而不断创建对象而浪费资源,不合算。

9.Android 倒计时功能

主要是利用了CountDownTimer类

class TimeCount extends CountDownTimer {
		public TimeCount(long millisInFuture, long countDownInterval) {
			super(millisInFuture, countDownInterval);// 参数依次为总时长,和计时的时间间隔
		}

		@Override
		public void onFinish() {// 计时完毕时触发
			bt.setText("重新验证");
			bt.setClickable(true);
			bt.setBackgroundColor(0x77ffffff);
		}

		@Override
		public void onTick(long millisUntilFinished) {// 计时过程显示
			bt.setClickable(false);
			bt.setBackgroundColor(0x77cccccc);
			bt.setText("还剩下"+millisUntilFinished / 1000 + "秒");
		}
	}
要用的时候
mTimeCount=new TimeCount(10000, 1000);
		mTimeCount.start();

10,Android常用Http请求的封装

先定义请求结果返回的接口

/**
 * 回调服务返回的接口
 *
 */
public interface HttpCallbackListener {

	void onFinish(String response);

	void onError(Exception e);

}

请求代码

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import android.util.Log;

public class HttpUtil {
	public static void sendHttpRequest(final String address,
			final HttpCallbackListener httpCallbackListener) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				//HttpURLConnection
				HttpURLConnection connection = null;
				try {
					URL url = new URL(address);
					connection = (HttpURLConnection) url.openConnection();
					connection.setRequestMethod("GET");
					connection.setReadTimeout(8000);
					connection.setConnectTimeout(7000);
					InputStream is = connection.getInputStream();
					BufferedReader bReader = new BufferedReader(
							new InputStreamReader(is));
					StringBuilder response = new StringBuilder();
					String line;
					while ((line = bReader.readLine()) != null) {
						response.append(line);
					}
					if (httpCallbackListener != null) {
						// 回调onFinish()方法
						httpCallbackListener.onFinish(response.toString());
						Log.d("返回的数据是:-->", response.toString());
					}
				} catch (Exception e) {
					
					if (httpCallbackListener != null) {
						// 回调onError()方法
						httpCallbackListener.onError(e);
					}
				} finally {
					if (connection != null) {
						connection.disconnect();
					}
				}
			}
		}).start();
	}

}




如果对以上文章内容有疑惑,或存在不当之处,还请指出,共同进步!






Android开发实用代码片段集合:深入Fragment技术 要实现自定义的FragmentTransaction动画,你需要做以下几步:创建自定义动画资源文件,通常这些文件存放在res/anim文件夹中。例如,创建一个名为的动画资源文件。```xml```在代码中使用这些动画资源,通过来设置自定义的添加和移除动画。java懒加载的定义是指在某个组件需要被展示给用户时,才去加载该组件的相关数据和视图,从而避免不必要的资源消耗。对于Fragment来说,意义在于:提升首屏加载速度。 阅读详情

相关推荐

深入探索安卓Android输入法开发——从源码到实现

用户自定义纠正词库可以显著提升输入法的个性化水平。例如,专业术语、网络新词或个人姓名等,标准词库中可能不存在,用户通过自定义词库可以快速输入这些词汇。在Android平台上,实现用户自定义纠正词库应用,需要设计存储结构来保存用户的自定义词汇,并在输入时进行匹配。简单的实现可以使用SharedPreferences或SQLite数据库来存储自定义词库数据。以下是一个使用SharedPreferences存储用户自定义词库的基本示例:// 将用户自定义词添加到词库。

weixin_42612405的博客 1905

android 合并图片,请问如何在安卓中两个图片都用一半合并成一张图片。

//合成public class MainActivity extends AppCompatActivity {@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageVie...

weixin_39528467的博客 420

分布式 Agent 系统设计:高并发场景下的挑战与解决方案

分布式 Agent 系统由多个分布在不同节点上的智能 Agent 组成,这些 Agent 具有自主决策能力,能够通过通信协作完成复杂任务。每个 Agent 可以看作是一个独立的实体,具备感知环境、处理信息、执行动作的功能,它们相互协作,共同实现系统的整体目标。分布式 Agent 系统在高并发场景下面临着资源调度、通信延迟、状态一致性、容错处理和性能瓶颈等诸多挑战。通过采用动态资源分配、高效通信协议、分布式共识算法、冗余备份等解决方案,可以有效应对这些挑战,提高系统的性能、可靠性和可用性。

shuizhudan223的博客 1292

Android开发常用代码片段

//获取drawable对象public static Drawable getDrawable(Context context,int id){ Resource res = context.getResource(); Drawable drawable = res.getDrawable(id); return drawable;}//drawable转bitmap对象 ...

zhuxingchong的博客 274

Xlinx PG151 除法器IP 笔记

对Xlinx 除法器IP PG151中部分内容记录备忘。

weixin_50515160的博客 2528

YOLO详解

本文参考知乎 https://zhuanlan.zhihu.com/p/25236464 1. YOLO的创新点 YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。 从网络设计上,YOLO与two steps的目标检测方法如RCNN、Fast RCNN和Faster RCNN的区别如下: YOLO训练和检测均是在一个单独网...

UnknownPlayer的博客 9949

安卓开发一些基础的设置代码

DialogFragment设置背景透明 onCreateView Window window = getDialog().getWindow(); if (window != null) { window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); }

程序小渣渣 2405

计算机图形学入门30:动画与模拟介绍

计算机图形学入门,动画与模拟,物理模拟,质点弹簧系统,运动学,粒子系统,动作捕捉。

YanisWu的博客 1485

MPAndroidChart3.0使用详解(一)----基本属性设置

说到Android中的图表库,除了老牌的谷歌推荐的Achartengine图表库,那不得不提一下MPAndroidChart这个类库了,相比前者,后者功能十分丰富,github的star超过17K。其支持直方图(柱状图)、折线图、饼状图、气泡图、雷达图、散点图、蜡烛图、组合图。支持缩放、点击事件、动画效果等。截至于本文,最新的版本是3.0.2,相比以前的2.x的版本,功能上有很大的丰富,支持的属性更

gongwq的博客 7462

【ODX介绍】-4.2-UDS诊断$27服务在ODX-D诊断描述文件中如何描述

共25页精讲:附ODX-D XML:UDS $27 Security服务0x61和0x62 Sub-Function,其它Sub-Function可参照其格式。 目录 1 ODX-D描述一个UDS $27 Security服务Sub-Function的结构 2 标签DIAG-SERVICE描述的内容 2.1 举例:DIAG-SERVICE的XML描述 3 标签REQUEST描述的内容 3.1 举例:REQUEST的XML描述 4 标签POS-RESPONSE描述的内容 4.1 举例:PO..

「汽车电子助手」的博客 1122

EfficientNet 改进:添加混合卷积提取特征

混合卷积(Mixed Convolution)是一种在卷积神经网络(CNN)中结合多种卷积操作的策略,旨在通过融合不同卷积核大小或类型的卷积操作来提升模型的性能和灵活性。:例如标准卷积、深度可分离卷积(Depthwise Separable Convolution)、分组卷积(Grouped Convolution)等,可以在计算效率和特征提取能力之间取得平衡。混合卷积可以根据任务需求动态调整卷积操作的组合方式,适应不同的输入数据分布。:通过引入可学习的权重,动态调整不同卷积操作的贡献。

Henry的博客 660

2024年安卓最全Android开发实用代码片段(一),程序员去大公司面试

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!

2401_84132723的博客 536

震惊!用刚发布的GPT-5写研究现状,文献综述写作一整个大逆袭(附步骤+10条AI提示词)

每类分别给出:国内重点(3 条)、国外重点(3 条)、代表性方法(2–3 条)、代表成果(各 1–2 条)、主要问题(2 条)。每个场景给出:技术方案(2–3 种)、研究目标、实际成效/案例、当前挑战(3 点)。指令:基于国内外现状,系统列出当前学界的研究空白、关键未解问题与争议焦点(每项配简要证据/示例),并针对每个空白提出 1–2 条可行的研究方向或方法路径。三、差异与研究空白分析(≥300 字)。对每个小节提供:小标题、中心论点(1 句)、拟写要点(3–5 条)、建议引用类型(理论/方法/案例)。

qq_64378896的博客 114

Android开发实用代码片段(一)(1)

定时器实现:Handler+Timer+TimerTask。handler定时器使用postDelyed实现。在SDCard中创建与删除文件权限。往SDCard写入数据权限。handler定时器。

2401_84545213的博客 150

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android开发实用代码片段(一),2024金九银十Android大厂面试题来袭

定时器实现:Handler+Timer+TimerTask。handler定时器使用postDelyed实现。在SDCard中创建与删除文件权限。往SDCard写入数据权限。先定义请求结果返回的接口。handler定时器。

2301_77118221的博客 305

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

如何正确获取安卓内置SD卡的路径

  前面一篇文章讲了怎样获取外围卡(即可移除的SD卡)。那么自然就有个问题:怎样获取内置卡?   其实这个很简单,相信各位也很熟悉。也许有人想省事,所以吾就把代码码放这里: private static String getAppRootOfSdCardInternal() { if (!Environment.getExternalStorageState(...

柳鲲鹏 1811

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 怎么判断Wifi 是否可用

为了节省用户gprs流量,在wifi可用情况下,某些网络传输功能才可以使用。这个时候,需要判断wifi是否可用,怎么判断呢?请参阅下面的主要的主要代码: private boolean IsStartWifi(final Context context) { try { WifiManager wm = (WifiManager) context.getSystemSe

心灵净土 4966

ListView的使用,PopupWindow菜单栏的使用android

ListView的使用,PopupWindow菜单栏的使用 1.AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" pa...

苏凯的博客 275

android 实用代码片段整理

android 常用代码片段,前1-10条是从网上摘录,向原作者致谢。后面为自己整理。1、设置窗口格式为半透明 getWindow().setFormat(PixelFormat.TRANSLUCENT); 2、Android中在非UI线程里更新View的不同方法: * Activity.runOnUiThread( Runnable ) * View.post( Runnable )

浩宇碧海 1371

Android开发常用代码片段(一)

Android开发常用代码片段(一) 文章目录Android开发常用代码片段(一)拨打电话跳转至拨号界面发送短信唤醒屏幕并解锁判断当前App处于前台还是后台状态 拨打电话 /** * 拨打电话 * @param context 上下文 * @param phoneNumber 电话号码 */ private static void call(Context context, String ...

haijie_liu的博客 836

Android开发常用代码片段(三)

Android开发常用代码片段(三) 前一篇:Android开发常用代码片段(二) 后一篇:正在更新中。。。 文章目录Android开发常用代码片段(三)获取当前设备的MAC地址 获取当前设备的MAC地址 ...

haijie_liu的博客 451

Android_开发者实用代码片段 收集

Android开发者实用代码片段 与大家分享        Android很有用的代码片段        1:查看是否有存储卡插入         String status=Environment.getExternalStorageState(); if(status.equals(Enviroment.MEDIA_MOUNTED)) { 说明有SD卡插入 }      

oooo 351
上一篇: Activity与Service的那些事
下一篇: JAVA字符串格式化-String.format()的使用总结
android_cmos
博客等级 码龄12年 177粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值