㈠ 如何进行android数据库操作
在自己Android数据库接收或发出一个系统action的时候,要名副其实。比如你响应一个view动作,做的确实edit的勾当,你发送一个pick消息,其实你想让别人做edit的事,这样都会造成混乱。
一个好的习惯是创建一个辅助类来简化你的Android数据库交互。考虑创建一个数据库适配器,来添加一个与数据库交互的包装层。它应该提供直观的、强类型的方法,如添加、删除和更新项目。数据库适配器还应该处理查询和对创建、打开和关闭数据库的包装。
它还常用静态的Android数据库常量来定义表的名字、列的名字和列的索引。下面的代码片段显示了一个标准数据库适配器类的框架。它包括一个SQLiteOpenHelper类的扩展类,用于简化打开、创建和更新数据库。
import android.content.Context; import android.database.*; import android.database.sqlite.*; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.util.Log; public class MyDBAdapter { // The name and column index of each column in your database. public static final String KEY_NAME=”name”; public static final int NAME_COLUMN = 1; // TODO: Create public field for each column in your table. // SQL Statement to create a new database. private static final String DATABASE_CREATE = “create table “ + DATABASE_TABLE + “ (“ + KEY_ID + “ integer primary key autoincrement, “ + KEY_NAME + “ text not null);”; // Variable to hold the database instance private SQLiteDatabase db; // Context of the application using the database. private final Context context; // Database open/upgrade helper private myDbHelper dbHelper; public MyDBAdapter(Context _context) { context = _context; dbHelper = new myDbHelper(context, DATABASE_NAME, null, DATABASE_VERSION); } public MyDBAdapter open() throws SQLException { db = dbHelper.getWritableDatabase(); return this; } public void close() { db.close(); } public long insertEntry(MyObject _myObject) { ContentValues contentValues = new ContentValues(); // TODO fill in ContentValues to represent the new row return db.insert(DATABASE_TABLE, null, contentValues); } public boolean removeEntry(long _rowIndex) { return db.delete(DATABASE_TABLE, KEY_ID + “=” + _rowIndex, null) > 0; } public Cursor getAllEntries () { return db.query(DATABASE_TABLE, new String[] {KEY_ID, KEY_NAME}, null, null, null, null, null); } public MyObject getEntry(long _rowIndex) { MyObject objectInstance = new MyObject(); // TODO Return a cursor to a row from the database and // use the values to populate an instance of MyObject return objectInstance; } public int updateEntry(long _rowIndex, MyObject _myObject) { String where = KEY_ID + “=” + _rowIndex; ContentValues contentValues = new ContentValues(); // TODO fill in the ContentValue based on the new object return db.update(DATABASE_TABLE, contentValues, where, null); } private static class myDbHelper extends SQLiteOpenHelper { public myDbHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } // Called when no database exists in // disk and the helper class needs // to create a new one. @Override public void onCreate(SQLiteDatabase _db) { _db.execSQL(DATABASE_CREATE); }
㈡ android 怎么实现左侧导航栏
Android左侧推出导航菜单可以让Activity继承PopupWindow类来实现的弹出窗体,布局可以根据自己定义设计。弹出效果主要使用了translate和alpha样式实现。具体的做法是下列代码:
第一步:设计弹出窗口xml:
Xml代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical"
>
<LinearLayout
android:id="@+id/pop_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical"
android:layout_alignParentBottom="true"
android:background="@drawable/btn_style_alert_dialog_background"
>
<Button
android:id="@+id/btn_take_photo"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="20dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="拍照"
android:background="@drawable/btn_style_alert_dialog_button"
android:textStyle="bold"
/>
<Button
android:id="@+id/btn_pick_photo"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="5dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="从相册选择"
android:background="@drawable/btn_style_alert_dialog_button"
android:textStyle="bold"
/>
<Button
android:id="@+id/btn_cancel"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="15dip"
android:layout_marginBottom="15dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="取消"
android:background="@drawable/btn_style_alert_dialog_cancel"
android:textColor="#ffffff"
android:textStyle="bold"
/>
</LinearLayout>
</RelativeLayout>
第二步:创建SelectPicPopupWindow类继承PopupWindow:
Java代码
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.PopupWindow;
public class SelectPicPopupWindow extends PopupWindow {
private Button btn_take_photo, btn_pick_photo, btn_cancel;
private View mMenuView;
public SelectPicPopupWindow(Activity context,OnClickListener itemsOnClick) {
super(context);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mMenuView = inflater.inflate(R.layout.alert_dialog, null);
btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo);
btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo);
btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel);
//取消按钮
btn_cancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//销毁弹出框
dismiss();
}
});
//设置按钮监听
btn_pick_photo.setOnClickListener(itemsOnClick);
btn_take_photo.setOnClickListener(itemsOnClick);
//设置SelectPicPopupWindow的View
this.setContentView(mMenuView);
//设置SelectPicPopupWindow弹出窗体的宽
this.setWidth(LayoutParams.FILL_PARENT);
//设置SelectPicPopupWindow弹出窗体的高
this.setHeight(LayoutParams.WRAP_CONTENT);
//设置SelectPicPopupWindow弹出窗体可点击
this.setFocusable(true);
//设置SelectPicPopupWindow弹出窗体动画效果
this.setAnimationStyle(R.style.AnimBottom);
//实例化一个ColorDrawable颜色为半透明
ColorDrawable dw = new ColorDrawable(0xb0000000);
//设置SelectPicPopupWindow弹出窗体的背景
this.setBackgroundDrawable(dw);
//mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框
mMenuView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int height = mMenuView.findViewById(R.id.pop_layout).getTop();
int y=(int) event.getY();
if(event.getAction()==MotionEvent.ACTION_UP){
if(y<height){
dismiss();
}
}
return true;
}
});
}
}
第三步:编写MainActivity类实现测试:
Java代码
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity {
//自定义的弹出框类
SelectPicPopupWindow menuWindow;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) this.findViewById(R.id.text);
//把文字控件添加监听,点击弹出自定义窗口
tv.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//实例化SelectPicPopupWindow
menuWindow = new SelectPicPopupWindow(MainActivity.this, itemsOnClick);
//显示窗口
menuWindow.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置
}
});
}
//为弹出窗口实现监听类
private OnClickListener itemsOnClick = new OnClickListener(){
public void onClick(View v) {
menuWindow.dismiss();
switch (v.getId()) {
case R.id.btn_take_photo:
break;
case R.id.btn_pick_photo:
break;
default:
break;
}
}
};
}
上述的代码实现了从底部弹出,也可以根据PopupWindow类设置从左下部弹出。
Android的对话框有两种:PopupWindow和AlertDialog。它们的不同点在于:
AlertDialog的位置固定,而PopupWindow的位置可以随意
AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的
PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
㈢ Android 13 适配指南
2022 的Google I/O 发布了 Android 13 beta 2 和 Android 13 Beta 1 国内厂商的设备支持列表,虽然按照惯带羡嫌例, Android 13 应该是年末才发布正式版,但是相信有的开发者已经收到了平台的 Android13 的适配要求,所以本篇也是派陵结合 Oppo 的 Android 13 应用兼容性适配指导 和官方提供的一些文档内容做一个整理测试。
目前 Android 13 主要的兼容问题还是在于隐私权限上,所以本次的适配指南相关内容也是着重在这一部分, 这里涉及面比较广的应该就是相册和通知权限 。
这个动图大家可能看到过, 这是 Android 13 上提供的系统图片选择器,通过 Intent(MediaStore.ACTION_PICK_IMAGES); 就可以打开,支持视频、音频、图片分类,支持多选和单选 ,另外官方也表示过,这个特性不仅仅会在 Android 13 中出现,谷歌还会将其放置到 Play 商店中,向 Android 11 和 Android 12 设备推送。
我们通过调整 TargetSDK 设置为 PreView ,然后运行到 Tiramisu 的模拟器上进行测试,主要测试 TargetSDK 在低于 "Tiramisu" 和等于 "Tiramisu" 时的不同情况。
如下图所示:
总结: 所以如果是 TargetSDK 在 Android 13 以下,不需要处理,如果在 Android 13 以及以上 ,需要增加申请权限 。
在 Android R 上设置里开始支蠢手持在设置里对应用的通知权限进行管理,但是应用自身是无法修改应用级别的通知权限,所以 App 无法知道自身有没有发送通知的权限
所以在 Android 13 里增加了通知的运行时权限 ,其中 Android 13 (33) 的通知会根据正在运行的应用程序的目标 API 级别进行不同的处理, 不过不管应用程序的目标API级别如何,Android 13 都会提示用户授予应用程序发送通知的权限 。
例如下图,是 targetSdk 30 运行在 Android 13 模拟器上,依然会弹出让用户是否允许推送 。
当然,系统也会根据应用程序的目标 API 级别处理通知访问:
如果是 现有应用更新 ,程序的目标 API 级别为:
最后测试和总结一下:
由于 Android 之前可以通过跟踪附近的 Wi-Fi AP 和蓝牙设备来推断设备的位置,所以这次谷歌决定禁止应用程序 访问蓝牙 结果,除非这类应用需要声明 ACCESS_FINE_LOCATION 权限。
在 Android 13 中,Google 将 Wi-Fi 扫描与位置相关内容分离, Android 13 为管理设备与周围 Wi-Fi 热点连接的应用添加 NEARBY_WIFI_DEVICES 运行时权限 (属于 NEARBY_DEVICES 权限组),从而在不需要 ACCESS_FINE_LOCATION 权限的情况下,也可以让应用访问附近的 Wi-Fi 设备。
此前,对于仅需要连接 Wi-Fi 设备,但实际上并不需要了解设备位置的应用来说,以 Android 13 (33)为目标平台的应用现在可以通过 “ neverForLocation ” 属性来完善申请 NEARBY_WIFI_DEVICES 权限。
这项新权限会影响几个不同的 Wi-Fi 用例,包括以下用例:
所以开发需要区分不同api对应的权限;
由于 NEARBY_WIFI_DEVICES 权限仅适用于 Android 13 或更高版本, 如果是 Android12L(32) 以及以下的 App 应保留对 ACCESS_FINE_LOCATION 的所有声明:
以 Android 13(33) 为目标平台时,如果应用不会通过 Wi-Fi API 推导物理位置,请在清单文件中将 usesPermissionFlags 属性设为 neverForLocation。
所以总结: 以 Android 13(33) 为目标平台的应用程序,访问附近的 WI-FI 设备。除特例API需要申请ACCESS_FINE_LOCATION外,其他需要申请 android.permission.NEARBY_WIFI_DEVICES 运行时权限 ;
Android 13 中引入了 “在使用时” 访问身体传感器(例如心率、体温和血氧饱和度)的概念,此访问模式与 Android 10(API 级别 29)系统为位置信息 引入的模式非常相似。
如果你的 App 以 Android 13(33) 为目标平台,并且在后台运行时需要访问身体传感器信息,那么除了现有的 BODY_SENSORS 权限外,还必须声明新的 BODY_SENSORS_BACKGROUND 权限 。
当 App 以 Android 13(33) 或更高版本为 Target 的其他应用的导出组件发送 intent 时,仅当该 intent 与接收应用中的 <intent-filter> 元素匹配时,系统才会传送该 intent,换言之系统会屏蔽所有不匹配的 intent,但以下情况除外:
为了帮助提高运行时接收器的安全性,Android 13 允许你指定 App 中的特定广播接收器是否应被导出以及是否对设备上的其他应用可见,此变更是 Android 12 更安全的组件 的延续;
以 Android 13(33) 或更高版本为目标平台的应用,必须为每个广播接收器指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED ,否则当 App 尝试注册广播接收器时,系统会抛出 SecurityException
在 Android 13中,谷歌添加了一个新的API,允许开发者降级权限。
应用程序可以触发撤销授予调用 API 的包的一个或多个运行时权限,不需要访问特定运行时权限控制 API 的应用程序可以自行撤销这些权限,这样用户就可以确保这些应用程序不会在不知情的情况下使用这些API。
如需撤消特定运行时权限,请将该权限的名称传入 revokeOwnPermissionOnKill() 方法,如需同时撤消一组运行时权限,请将这组权限的名称传入 revokeOwnPermissionsOnKill() 。
系统只有在安全的情况下才会触发撤消操作,也就是当有应用组件仍在前台运行,或者有另一个应用正在访问你应用的组件(如 content provider)时不会发生撤消。
Android 之前一直提供了一个剪贴板服务,所有 App 都可以使用它来放置和检索文本。
尽管从技术上讲,任何应用都可以清除全局剪贴板中的主内容(只要它们是前台应用或 Android 10+ 上的默认输入法),但 Android 本身不会自动清除剪贴板。
这意味着任何留在全局剪贴板中的剪贴板内容,都可以在以后被应用程序读取,尽管 Android 的剪贴板访问有 toast 消息可能会提醒用户。
Android 13 增加了剪贴板自动清除功能,此功能在默认情况下处于禁用状态,在经过设定的时间后,将自动从全局剪贴板中清除主剪辑, 默认情况下经过3600000毫秒(60分钟)后,剪贴板将被清除。
每次执行复制/读取(写入剪贴板 setPrimaryClip ,读 getPrimaryClip )时,会重置一个消息 timeout(60min),之后会自动清除剪贴板内存中的内容,即60min内,如果一直没有写入剪贴板的操作,剪贴板的内容会被自动清除。
Android 13 的新前台服务( Foreground Services:FGS)任务管理器显示当前运行前台服务的应用程序列表,此列表称为活动应用程序,可以通过下拉通知抽屉并点击启示来访问,这时候每个应用程序旁边都会有一个“停止”按钮。
利用 JobScheler,应用可使用 JobInfo.Builder.setPrefetch() 将特定作业标记为“预提取”,这意味着理想情况下这些作业应该在应用下一次启动前提前一点运行,以提升用户体验。
过去,JobScheler 仅使用该信号让预提取作业有机会使用免费或多余的数据,在 Android 13 中系统现在会尝试确定应用下次启动的时间,并根据该估算值运行预提取作业,应用应尝试使用“预提取”来完成他们想要在下次应用启动前完成的任何工作。
Android 13 中引入了 电池资源利用率 功能,以便为系统提供多种方法来更好地管理设备电池续航时间:
㈣ 请android高手帮忙!
使用照相机的方法:
//在监听事件中加入如下代码
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/","temp.jpg")));
startActivityForResult(intent, reqCode_CAMERA);// reqCode_CAMERA是一个一自己设定的值,用于在onActivityResult方法中判断是哪一个activity返回的
再重写onActivityResult方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == reqCode_CAMERA && resultCode== RESULT_OK){
////这里是直接隐式启动系统图片预览程序
// Intent intent = new Intent();
// intent.setAction(Intent.ACTION_VIEW);
//// uri指向用户选择的那个图片
// Uri uri = data.getData();
// intent.setData(uril);
// startActivity(intent);
// Uri uri = data.getData();
// Cursor cursor = getContentResolver().query(uri, null, null, null, null);
// if(cursor!=null&&cursor.moveToFirst()){
// String path = cursor.getString(1);
// Bitmap bm = BitmapFactory.decodeFile(path);
// iv.setImageBitmap(bm);
// }
// iv.setImageURI(uri);
//也可以用这里代码打开图片裁剪
Intent intent = new Intent();
intent.setAction("com.android.camera.action.CROP");
intent.setType("image/*");
intent.putExtra("data", data.getExtras().getParcelable("data"));
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);//默认图片剪裁起始位置x值
intent.putExtra("aspectY", 1);//默认图片剪裁起始位置y值
intent.putExtra("outputX", 128);//默认图片剪裁终止位置x值
intent.putExtra("outputY", 128);//默认图片剪裁终止位置x值
intent.putExtra("return-data", true);
startActivityForResult(intent, reqCode_Zoom);
}//这里是处理剪裁图片返回后的处理,直接调用ImageView显示了,你可以根据你的需要修改
else if(requestCode==reqCode_Zoom){
Bitmap bitmap = data.getExtras().getParcelable("data");
iv.setImageBitmap(bitmap);
}
上传本地图片方法:
按钮名.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 隐式启动系统相册程序
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setDataAndType(Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, reqCode_PICK);// reqCode和上面一样自己定义,但是不要重复了
}
});
再在onActivityResult方法添加一个"elseif(requestCode == reqCode_PICK && resultCode== RESULT_OK)"条件,方法体直接参考上面,就是在剪裁那里把“intent.putExtra("data", data.getExtras().getParcelable("data"));”换为“intent.setDataAndType(data.getData(), "image/*");”就可以了。
㈤ android中为什么要使用intent进行通信
1、Intent对象详解
Android的应用程序包含三种重要组件:Activity、Service、BroadcastReceiver,应用程序采用一致的方式来启动它们----都是依靠Intent来进行启动的,Intent就封装了程序想要启动程序的意图,不仅如此,Intent还用于与被启动组件进行交换信息。
组件类型
启动方法
Activity
startActivity(Intent intent)
startActivityForResult(Intent intent,intrequestCode)
Service
ComponentName startService(Intent service)
boolean bindService(Intent service,ServiceConnection conn,int flags)
BroadcastReceiver
sendBroadcast(Intent intent)
sendBroadcast(Intent intent,String receiverPermission)
sendOrderedBroadcast(Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handler scheler,int initialCode,String initialData,Bundle initialExtras)
sendOrderedBroadcast(Intent intent,String receiverPermission)
sendStickyOrderedBroadcast(Intent intent,BroadcastReceiver resultReceiver,Handler scheler,int initialCode,String initialData,Bundle initialExtras)
Intent对象大致包含Component、Action、Category、Data、Type、Extra和Flag这7种属性,其中Component用于明确指定需要启动的目标组件,而Extra则用于“携带”需要交换的数据。
2、Intent的属性及Intent-filter配置
(1)Component属性
Intent的Component属性需要接受一个ComponentName对象,应用程序可根据给定的组件类去启动特定的组件。
当程序通过Intent的Component属性(明确指定了启动哪个组件)启动特定组件时,被启动组件几乎不需要使用<intent-filter.../>元素进行配置。
(2)Action、Category属性与intent-filter配置
Intent的Action和Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,Category则用于为Action增加额外的附加类别信息,通常,Action与Category结合使用。
<intent-filter.../>元素里通常可包括如下子元素:
a、0~N个<action.../>子元素
b、0~N个<category.../>子元素
c、0~1个<data.../>子元素
<action.../><category.../>子元素的配置非常简单,它们都可指定android:name属性,该属性的值就是一个普通字符串。
当<activity.../>元素里的<intent-filter.../>子元素里包含多个<action.../>子元素(相当于指定了多个字符串)时,就表明该Activity能响应Action属性值为其中任意一个字符串的Intent。
一个Intent对象最多只能包括一个Action属性,程序调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可包含多个Category属性,调用Intent的addCategory(String str)方法添加。
当程序创建Intent时,该Intent默认启动Category属性值为Intent.CATEGORY_DEFAULT常量(常量值为android.intent.category.DEFAULT)的组件。
(3)指定Action、Category调用系统Activity
实际上,Android内部提供了大量标准Action、Category常量,其中用于启动Activity的标准Action常量及对应的字符串如下:
Action常量
对应字符串
简单说明
ACTION_MAIN
android.intent.action.MAIN
应用程序入口
ACTION_VIEW android.intent.action.VIEW 显示指定数据
ACTION_ATTACH_DATA android.intent.action.ATTACH_DATA 指定某块数据将被附加到其它地方
ACTION_EDIT android.intent.action.EDIT 编辑指定数据
ACTION_PICK android.intent.action.PICK 从列表中选择某项并返回所选的数据
ACTION_CHOOSER android.intent.action.CHOOSER 显示一个Activity选择器
ACTION_GET_CONTENT android.intent.action.GET_CONTENT 让用户选择数据,并返回所选数据
ACTION_DIAL android.intent.action.DIAL 显示拨号面板
ACTION_CALL android.intent.action.CALL 直接向指定用户打电话
ACTION_SEND android.intent.action.SEND 向其他人发送数据
ACTION_SENDTO android.intent.action.SENDTO 向其他人发送消息
ACTION_ANSWER android.intent.action.ANSWER 应答电话
ACTION_INSERT android.intent.action.INSERT 插入数据
ACTION_DELETE android.intent.action.DELETE 删除数据
ACTION_RUN android.intent.action.RUN 运行维护
ACTION_SYNC android.intent.action.SYNC 执行数据同步
ACTION_PICK_ACTIVITY android.intent.action.PICK_ACTIVITY 用于选择Activity
ACTION_SEARCH android.intent.action.SEARCH 执行搜索
ACTION_WEB_SEARCH android.intent.action.WEB_SEARCH 执行Web搜索
ACTION_FACTORY_TEST android.intent.action.FACTORY_TEST 工厂测试的入口点
标准Category常量及对应的字符串如下:
Category常量
对应字符串
简单说明
CATEGORY_DEFAULT android.intent.category.DEFAULT 默认的Category
CATEGORY_BROWSABLE android.intent.category.BROWSABLE 指定该Activity能被浏览器安全调用
CATEGORY_TAB android.intent.category.TAB 指定Activity作为TabActivity的Tab页
CATEGORY_LAUNCHER android.intent.category.LAUNCHER Activity显示顶级程序列表中
CATEGORY_INFO android.intent.category.INFO 用于提供包信息
CATEGORY_HOME android.intent.category.HOME 设置该Activity随系统启动而运行
CATEGORY_PREFERENCE android.intent.category.PREFERENCE 该Activity是参数面板
CATEGORY_TEST android.intent.category.TEST 该Activity是一个测试
CATEGORY_CAR_DOCK android.intent.category.CAR_DOCK 指定手机被插入汽车底座(硬件)时运行该Activity
CATEGORY_DESK_DOCK android.intent.category.DESK_DOCK 指定手机被插入桌面底座(硬件)时运行该Activity
CATEGORY_CAR_MODE android.intent.category.CAR_MODE 设置该Activity可在车载环境下使用
3、Data、Type属性与intent-filter配置
Data属性通常用于向Action属性提供操作的数据,Data属性接收一个Uri对象,一个Uri对象通常通过如下形式的字符串表示:
content://com.android.contracts/contacts/1
tel:123
上面两个字符串的冒号前面大致指定了数据的类型,冒号后面是数据部分。
Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,当Intent不指定Data属性时Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性。
一旦为Intent同时指定Action、Data属性,那么Android将可根据指定的数据类型来启动特定的应用程序,并对指定数据执行相应的操作。下面介绍几个Action、Data属性的组合:
ACTION_VIEW content://com.android.contacts/contacts/1:显示标识为1的联系人的信息
ACTION_EDIT content://com.android.contacts/contacts/1:编辑标识为1的联系人的信息
ACTION_DIAL content://com.android.contacts/contacts/1:显示向标识为1的联系人拨号的界面
ACTION_VIEW tel:123:显示向指定号码123拨号的界面
ACTION_DIAL tel:123:显示向指定号码123拨号的界面
ACTION_VIEW content://contacts/people/:显示所有联系人列表的信息,通过这种组合可以方便地查看系统联系人
4、Extra属性
Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,Bundle对象就像一个Map对象,它可以存入多组key-value对,这样可以就可以通过Intent在不同Activity之间进行数据交换了。
㈥ android studio如何调用系统相册
在Android Studio中,可以使用Intent调用含哗握系统相册。以下是具体步骤:
1. 在你的Android Studio项目中创建一个Button或ImageView,用于触发打开相册的事件。
2. 在Button或ImageView的OnClick事件中添加以下代码:
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, PICK_IMAGE_REQUEST);
其中,PICK_IMAGE_REQUEST是一个整数常量,用于在Activity返回结果时进行识别。
3. 在Activity中添加以下代码,以处理从相册返回的结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
Uri uri = data.getData();
// 使用uri加载图片
}
}
在这个方法中,芦衫我们检查requestCode是否等于PICK_IMAGE_REQUEST,resultCode是否等于RESULT_OK,以及data和data.getData()是否不为null。如果这些条件都满足,我们就可以使用data.getData()方法获取从相册中选择的图片的Uri,并使用这个Uri加载图片。
注意:在使用打开谈庆相册的Intent时,需要在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
这个权限用于读取存储在设备上的图片。
㈦ 谷歌正式发布Android13,会给用户带来哪些新体验
Android13会给广大用户带来这些新功能体验:概览、照片选择器、附近的Wi-Fi 设备权限、按应用设定的语言偏好设置。
在许多情悔旦敬况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下新功能:
参考文献:[1].安卓平台。