Android 实时文件夹

实时文件夹是一种用来显示由某个ContentProvider提供的数据信息的桌面组件。要创建一个实时文件夹,必须要有两个方面的支持。

1,要定义一个用来创建实时文件夹的Activity。

2,所指定数据信息URI的ContentProvider必须支持实时文件夹时文件夹查询

一、定义创建实时文件夹的Activity

想在桌面长按后选择实时文件夹就会弹出一个可用实时文件夹的列表对话框,必须在应用程序内的Activity中添加一个Action为android.intent.action.CREATE_LIVE_FOLDER的IntentFilter。而在这个创建实时文件夹的Activity中,我们要把实时文件夹的信息以附加信息的形式存储在一个Intent对象当中。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.studio.android.ch10.ex2"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <application android:icon="@drawable/icon"
  7. android:label="@string/app_name">
  8. <activity android:name=".MyAllContacts"
  9. android:label="@string/app_name">
  10. <intent-filter>
  11. <action android:name=
  12. "android.intent.action.CREATE_LIVE_FOLDER" />
  13. <category android:name=
  14. "android.intent.category.DEFAULT" />
  15. </intent-filter>
  16. </activity>
  17. </application>
  18. <uses-sdk android:minSdkVersion="3" />
  19. </manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.studio.android.ch10.ex2"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon"
                 android:label="@string/app_name">
        <activity android:name=".MyAllContacts"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name=
                    "android.intent.action.CREATE_LIVE_FOLDER" />
                <category android:name=
                    "android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="3" />
</manifest> 

由于Content的ContentProvider已经实现了对实时文件夹的相关支持

  1. import android.app.Activity;
  2. import android.content.Intent;
  3. import android.net.Uri;
  4. import android.os.Bundle;
  5. import android.provider.Contacts;
  6. import android.provider.LiveFolders;
  7. public class MyAllContacts extends Activity {
  8. public static final Uri LIVE_FOLDER_URI =
  9. Uri.parse("content://contacts/live_folders/people");
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. if (getIntent().getAction()
  14. .equals(LiveFolders.ACTION_CREATE_LIVE_FOLDER)) {
  15. Intent intent = new Intent();
  16. intent.setData(LIVE_FOLDER_URI);//在文件夹,对于要查询的URI则是以Data的形式存储在Intent对象中。Contacts的ContentProvider已经实现了对实时文件夹的相关支持。
  17. intent.putExtra(
  18. LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT,
  19. new Intent(Intent.ACTION_VIEW,
  20. Contacts.People.CONTENT_URI));
  21. intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME,
  22. "MyAllContacts");
  23. intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON,
  24. Intent.ShortcutIconResource.fromContext(this,
  25. R.drawable.icon));
  26. intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE,
  27. LiveFolders.DISPLAY_MODE_LIST);//还可以设置LiveFolders.DISPLAY_MODE_LIST
  28. setResult(RESULT_OK, intent);
  29. } else {
  30. setResult(RESULT_CANCELED);
  31. }
  32. finish();
  33. }
  34. }
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Contacts;
import android.provider.LiveFolders;

public class MyAllContacts extends Activity {
    public static final Uri LIVE_FOLDER_URI =
        Uri.parse("content://contacts/live_folders/people");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getIntent().getAction()
                .equals(LiveFolders.ACTION_CREATE_LIVE_FOLDER)) {

            Intent intent = new Intent();

            intent.setData(LIVE_FOLDER_URI);//在文件夹,对于要查询的URI则是以Data的形式存储在Intent对象中。Contacts的ContentProvider已经实现了对实时文件夹的相关支持。
            intent.putExtra(
                    LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT,
                    new Intent(Intent.ACTION_VIEW,
                            Contacts.People.CONTENT_URI));
            intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME,
                    "MyAllContacts");
            intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON,
                    Intent.ShortcutIconResource.fromContext(this,
                            R.drawable.icon));
            intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE,
                    LiveFolders.DISPLAY_MODE_LIST);//还可以设置LiveFolders.DISPLAY_MODE_LIST

            setResult(RESULT_OK, intent);
        } else {
            setResult(RESULT_CANCELED);
        }

        finish();
    }
}

二、定义支持实时文件夹的ContentProvider

要使一个ContentProvider支持实时文件夹的查询,主要要实现下面2个:

1,为实时文件夹查询定义一个专门的URI

2,在query查询方法中针对实时文件夹的路径进行相应的查询然后返回含有特定列名的Cursor

在CountryCode.java中

//为URI匹配器增加实时文件夹URI的匹配号码

public static final int LIVE_FOLDER = 3;

---

---

---

//定义实时文件夹的URI

public static final Uri LIVE_FOLDER_URI =

Uri.parse("content://" + AUTHORITY + "/livefolder");

在MyProvider.java中

static {

sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

----

---

sMatcher.addURI(CountryCode.AUTHORITY,

"livefolder/", CountryCode.LIVE_FOLDER);

}

---

---

@Override

public Cursor query(Uri uri, String[] projection,

String selection, String[] args,String order) {

SQLiteDatabase db = dbHelper.getReadableDatabase();

Cursor c;

switch (sMatcher.match(uri)) {

----

case CountryCode.LIVE_FOLDER:

String[] myProjection = {

//注意更改别名

CountryCode.ID + " AS " + LiveFolders._ID,

CountryCode.COUNTRY + " AS " + LiveFolders.NAME,

CountryCode.CODE + " AS " + LiveFolders.DESCRIPTION

};

c = db.query(CountryCode.TB_NAME, myProjection, selection,

args,null,null,order);

break;

default:

throw new IllegalArgumentException("Unknown URI " + uri);

}

c.setNotificationUri(getContext().getContentResolver(), uri);

return c;

}

CreateLiveFolder.java中

import android.app.Activity;

  1. import android.content.Intent;
  2. import android.os.Bundle;
  3. import android.provider.LiveFolders;
  4. public class CreateLiveFolder extends Activity {
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. if (getIntent().getAction()
  9. .equals(LiveFolders.ACTION_CREATE_LIVE_FOLDER)) {
  10. Intent intent = new Intent();
  11. intent.setData(CountryCode.LIVE_FOLDER_URI);
  12. intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME,
  13. "CountryCode");
  14. intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON,
  15. Intent.ShortcutIconResource.fromContext(this,
  16. R.drawable.icon));
  17. intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE,
  18. LiveFolders.DISPLAY_MODE_LIST);
  19. setResult(RESULT_OK, intent);
  20. } else {
  21. setResult(RESULT_CANCELED);
  22. }
  23. finish();
  24. }
  25. }
import android.content.Intent;
import android.os.Bundle;
import android.provider.LiveFolders;

public class CreateLiveFolder extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getIntent().getAction()
                .equals(LiveFolders.ACTION_CREATE_LIVE_FOLDER)) {

            Intent intent = new Intent();

            intent.setData(CountryCode.LIVE_FOLDER_URI);
            intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME,
                    "CountryCode");
            intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON,
                    Intent.ShortcutIconResource.fromContext(this,
                            R.drawable.icon));
            intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE,
                    LiveFolders.DISPLAY_MODE_LIST);

            setResult(RESULT_OK, intent);
        } else {
            setResult(RESULT_CANCELED);
        }
        finish();
    }
}
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.studio.android.chp10.ex3"
  4. android:versionCode="1"
  5. android:versionName="1.0.0">
  6. <application android:icon="@drawable/icon" android:label="@string/app_name">
  7. <activity android:name=".SQLite2"
  8. android:label="@string/app_name">
  9. <intent-filter>
  10. <action android:name="android.intent.action.MAIN" />
  11. <category android:name="android.intent.category.LAUNCHER" />
  12. </intent-filter>
  13. </activity>
  14. <provider android:name="MyProvider"
  15. android:authorities="com.studio.andriod.provider.countrycode" />
  16. <activity android:name=".CreateLiveFolder">
  17. <intent-filter>
  18. <action android:name=
  19. "android.intent.action.CREATE_LIVE_FOLDER" />
  20. <category android:name=
  21. "android.intent.category.DEFAULT" />
  22. </intent-filter>
  23. </activity>
  24. </application>
  25. </manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.studio.android.chp10.ex3"
      android:versionCode="1"
      android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SQLite2"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <provider android:name="MyProvider"
            android:authorities="com.studio.andriod.provider.countrycode" />

        <activity android:name=".CreateLiveFolder">
            <intent-filter>
                <action android:name=
                    "android.intent.action.CREATE_LIVE_FOLDER" />
                <category android:name=
                    "android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>  
时间: 2024-10-20 13:07:17

Android 实时文件夹的相关文章

Android Drawable文件夹对应像素密度

Android是自适应屏幕大小及密度的.Android为了保证在不同屏幕下的应用界面效果,提供了以下文件夹来储存图片资源.不同的文件夹对应像素密度不同的图片资源 drawable-ldpi:120dpi左右的屏幕(低密度) drawable-mdpi:160dpi左右的屏幕(中等密度) drawable-tvdpi:213dpi左右的屏幕(中高密度)这个主要在api13中为了优化面向电视的应用程序而引入的. drawable-hdpi:240dpi左右的屏幕(高密度) drawable-xdpi

android创建文件夹和文件和安装其他apk

一.android下创建文件夹 File sd=Environment.getExternalStorageDirectory(); String path=sd.getPath()+"/notes"; File file=new File(path); if(!file.exists()) file.mkdir(); 二.android下创建文件 HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet= new

使用实时文件夹显示ContentProvider的数据

所谓实时文件夹(即LiveFolder),是指用于显示ContentProvider提供的数据的桌面组件. ContentProvider用于向外提供数据访问的接口,一个应用程序可通过ContentProvider把自己的数据暴露出来,从而允许其他程序自由调用.ContentProvider除了可以供其他程序访问之外,还可通过实时文件夹添加成桌面快捷方式. 当用户把实时文件夹添加到系统桌面上之后,如果用户单击该实时文件夹图标,系统将会显示从指定ContentProvider查出来的全部数据---

Android获取文件夹路径 /data/data/

首先内部存储路径为/data/data/youPackageName/,下面讲解的各路径都是基于你自己的应用的内部存储路径下.所有内部存储中保存的文件在用户卸载应用的时候会被删除. 一. files1. Context.getFilesDir(),该方法返回/data/data/youPackageName/files的File对象.2. Context.openFileInput()与Context.openFileOutput(),只能读取和写入files下的文件,返回的是FileInput

Android 建立文件夹、生成文件并写入文本文件内容

一.首先添加权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 二.建立文件夹.生成文件并写入文本文件内容代码 private void initData() { String filePath = "/sdcard/Test/"; String fileName = "log.txt"

Android 多文件夹相册 + 获取最近拍照分析

最近有个任务下来 重构相册功能模块 主要功能点有如下: 1   ContentProvider 扫描手机中图片 获取 Cursor 自己写 GridView  因为调系统相册 不能进行图片多选 而且 每个手机调出来的系统相册 风格不统一 2   分文件夹  之前的相册模块就是因为没有分多文件夹 把系统相册里面所有的照片掏出来就展示了 3   最近拍照  或者 屏幕截图 的照片文件夹 置顶 以及 照片展示在 gridview 第一张 4   支持格式 jpg png bmp jpeg 5   多图

Android布局文件夹引起的问题

Android 运行到setContentView(R.layout.splash); 总是出现如下的错误: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.esri.localtiledlayer/com.login.SplashScreen}: android.view.InflateException: Binary XML file line #17: Error inflating class

android project 文件夹

android多国语言文件夹 http://www.blogjava.net/zhaojianhua/archive/2012/02/09/369676.html Android平板开发精确适配不同的dpi和屏幕尺寸http://blog.csdn.net/chenliangyin_love/article/details/8593299 Supporting Multiple Screenshttp://developer.android.com/guide/practices/screens

Android删除文件夹的代码实现

//删除文件夹 private void deleteDirectory(File folder) { if (folder.exists()) { File[] files = folder.listFiles(); if (files == null) { return; } for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { deleteDirectory(files[i]); } else { fi