android中activity可以响应外部的action的例子(可以用这个来导入外部文件)

如果我们在文件浏览器中点击一个文件,然后点击它,会弹出一个列表给你选择

如果使自己的应用也出现在这个列表上,必须在menifest的这个activity下加入:

        <activity
            android:name="com.example.clickabletextview.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.EDIT" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:mimeType="application/pdf" />
                <data android:mimeType="image/bmp" />
                <data android:mimeType="image/tiff" />
                <data android:mimeType="image/gif" />
                <data android:mimeType="image/jpeg" />
                <data android:mimeType="image/x-ms-bmp" />
                <data android:mimeType="image/png" />
                <data android:mimeType="image/x-pcx" />
                <data android:mimeType="image/targa" />
                <data android:mimeType="image/x-photoshop" />
                <data android:mimeType="text/plain" />
                <data android:mimeType="text/xml" />
                <data android:mimeType="text/html" />

            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <data
                    android:host="*"
                    android:mimeType="*/*"
                    android:pathPattern=".*\\.pdf"
                    android:scheme="file" />

                <data
                    android:host="*"
                    android:mimeType="*/*"
                    android:pathPattern=".*\\.jpg"
                    android:scheme="file" />

                <data
                    android:host="*"
                    android:mimeType="*/*"
                    android:pathPattern=".*\\.bmp"
                    android:scheme="file" />
                <data
                    android:host="*"
                    android:mimeType="*/*"
                    android:pathPattern=".*\\.png"
                    android:scheme="file" />

                <data
                    android:host="*"
                    android:mimeType="*/*"
                    android:pathPattern=".*\\.txt"
                    android:scheme="file" />

            </intent-filter>
        </activity>

然后在activity的oncreate上接收这个intent:

		Intent intent = this.getIntent();
		int flags = intent.getFlags();
		if ((flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
			if (intent.getAction() != null && Intent.ACTION_VIEW.equals(intent.getAction())) {
				if (SCHEME_FILE.equals(intent.getScheme()) || SCHEME_CONTENT.equals(intent.getScheme())) {

					String i_type = getIntent().getType();

					// mImportingUri=file:///storage/emulated/0/Vlog.xml
					intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
					mImportingUri = intent.getData();
					System.out.println("====mImportingUri=" + mImportingUri);

					InputStream is = null;
					try {
						is = getContentResolver().openInputStream(mImportingUri);
					} catch (Exception e) {
						System.out.println("====e="+e);
					}

					if (mImportingUri != null && SCHEME_FILE.equalsIgnoreCase(mImportingUri.getScheme())) {
						//Is file
						startToCopyFile(is);
					}else if(mImportingUri != null && SCHEME_CONTENT.equalsIgnoreCase(mImportingUri.getScheme())){
						startCopyMedia(is);
					}

				}
			}
		}

这里如果发现要导入的文件是media的格式

private boolean startCopyMedia(InputStream is) {
		Cursor c = null;
		try {
			c = getContentResolver().query(mImportingUri,
					new String[] {MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.SIZE},
					null, null, null);
			if (c != null && c.moveToFirst()) {
				int dn_index = c.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME);
				fromFileName = c.getString(dn_index);
				int s_index = c.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE);
				fromFileSize = c.getLong(s_index);
			}
		} catch (Exception e) {
			System.out.println("===query e="+e);
		}
		return true;
	}

如果发现要导入的文件是txt格式,则我们在sd卡下建立一个tmp的文件夹,把这个文件拷贝进去:

	public static void makesureFileExist(String path) {
		String separator = File.separator;
		int index = path.lastIndexOf(separator);
		path = path.substring(0, index);
		File f = new File(path);
		f.mkdirs();

		File f1 = new File(path);
		try {
			f1.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static String getSDPath(){
	       File sdDir = null;
	       boolean sdCardExist = Environment.getExternalStorageState()
	                           .equals(android.os.Environment.MEDIA_MOUNTED);   //判断sd卡是否存在
	       if(sdCardExist)
	       {
	         sdDir = Environment.getExternalStorageDirectory();//获取跟目录
	      }
	       if(sdDir!=null){
	    	   return sdDir.toString();
	       }else
	    	   return null;

	}

	private String getName(Uri uri) {
		String str = uri.toString();
		int index = str.lastIndexOf(File.separator);
		String name = str.substring(index,str.length());
		return name;
	}

	private boolean startToCopyFile(InputStream is) {

		String fileName = getSDPath()+tmpPath+File.separator+getName(mImportingUri);
		makesureFileExist(fileName);
		File toFile = new File(fileName);
		CopyThread mCopyThread = new CopyThread(is, toFile);
		new Thread(mCopyThread).start();
		return true;
	}

	private class CopyThread implements Runnable {

		private File toFile;
		private InputStream fosfrom = null;

		public CopyThread(InputStream fosfrom, File toFile) {
			this.fosfrom = fosfrom;
			this.toFile = toFile;
		}

		@Override
		public void run() {
			try {
				TimeUnit.MILLISECONDS.sleep(800);

				FileInputStream fosfrom = null;
				if (this.fosfrom != null) {
					fosfrom = (FileInputStream) this.fosfrom;
				}
				FileOutputStream fosto = new FileOutputStream(toFile);
				byte bt[] = new byte[1024];
				int c;
				int time = 0;
				while ((c = fosfrom.read(bt)) > 0) {
					fosto.write(bt, 0, c);
				}
				if (fosfrom != null) {
					fosfrom.close();
				}
				fosto.close();

			} catch (Exception e) {
				return;
			} finally {
				try {
					if (this.fosfrom != null) {
						this.fosfrom.close();
					}
				} catch (IOException e) {
				}
			}
		}
	}
	

代码:http://download.csdn.net/detail/baidu_nod/7712765

android中activity可以响应外部的action的例子(可以用这个来导入外部文件)

时间: 2024-10-12 03:03:28

android中activity可以响应外部的action的例子(可以用这个来导入外部文件)的相关文章

Android 中 Activity 启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standard" /> Activity的启动模式分为四种: 1. standard 在standard模式(

Android中Activity启动模式详解,可以控制程序按home键后进来还会调用一个自己不喜欢的界面

其实这是很简单的一个问题.但是这还是要对android中activity的启动模式有相当的理解才行,当点击home键的时候,懂Android的人都知道,他会把当前activity放到后退栈中, 栈(Stack)又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算.人们把此端称为栈顶,栈顶的第一个元素被称为栈顶元素,相对地,把另一端称为栈底.向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称为出栈或退栈,它是把栈

android中Activity回传数据

比如从A跳转到B,然后等待从B回传数据: 那么在A中这样跳转: startActivityForResult(intent, 100); 后面那个requestCode要大于0: 然后在A中重写这个方法: @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.e("onActivityResult", "onActivityResult&quo

Android中Activity的四种启动方式

谈到Activity的启动方式必须要说的是数据结构中的栈.栈是一种只能从一端进入存储数据的线性表,它以先进后出的原则存储数据,先进入的数据压入栈底,后进入的数据在栈顶.需要读取数据的时候就需要从顶部开始读取数据,栈具有记忆功能,对栈的操作不需要指针的约束.在Android中Activity的显示其实就是一个入栈和出栈的过程.当打开一个Activity的时候Activity入栈,当关闭一个Activity的时候Activity出栈,用户操作的Activity位于栈顶,一般情况下,一个应用程序对应一

Android中Activity切换时共享视图元素的切换动画(4.x兼容方案)

同时发布在我的博客 点此进入 开始 上一篇讲了使用 Google 的 AppCompat-v7 来实现 Activity 切换时实现共享视图元素的切换动画.这一篇介绍两个可以兼容 4.x 的两个第三方方案. 上一篇:Android中Activity切换时共享视图元素的切换动画(5.0以上) 方案一:PreLollipopTransition 首先在 build.gradle 配置文件添加这个库依赖 dependencies { compile 'com.kogitune:pre-lollipop

android 中activity 属性说明(转载)

转自:http://liuwuhen.iteye.com/blog/1759796 activity是android中使用非常平凡的一种组件,我们除了需要掌握activity中的生命周期以外,还需要掌握activity中的其 他设置. 1.activity 中主题的设置   android中我们可以通过AndroidManifest.xml中设置activity中的主题,其实android提供了许多自带的主题样式,如下: android:theme="@android:style/Theme.D

《Android笔记3.4》 Android 中 Activity 启动模式

课程背景:在 Android 中 Activity 有四种启动模式,每一种启动模式都代表着一种使用场合,对四种启动模式有深入的了解才能够在实际开发工作中得心应手,写出完美的程序. 核心内容:1.Activity Standard 启动模式2.Activity SingleTop 启动模式3.Activity SingleTask 启动模式4.Activity SingleInstance 启动模式 在AndroidManifest.xml中配置各个Activity的启动方式: 1.Activit

Android中Activity启动模式详解

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Android总Activity的启动模式分为四种: Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standard" /> Activity的四种启动模式:

android中activity.this跟getApplicationContext的区别

转载: http://www.myexception.cn/android/1968332.html android中activity.this和getApplicationContext的区别 在android中常常会遇到与context有关的内容 浅论一下context : 在语句 AlertDialog.Builder builder = new AlertDialog.Builder(this); 中,要求传递的 参数就是一个context,在这里我们传入的是this,那么这个this究