小编Kar*_*ran的帖子

Android mkdirs()创建一个零字节文件而不是文件夹

在我的Android应用程序中,我试图在SD卡上创建以下文件夹:

/mnt/sdcard/OSGiComponents/admin/felix-cache/
Run Code Online (Sandbox Code Playgroud)

这是代码:

File cacheDir = 
    new File( Environment.getExternalStorageDirectory().getAbsolutePath() + 
              "/OSGiComponents/admin/felix-cache/" );
// Create the folder
cacheDir.mkdirs();
// Check if it exists
if ( ! cacheDir.exists() ) {
    Log.e ( "Debug" , "Cache directory cannot be created" );
}
Run Code Online (Sandbox Code Playgroud)

我在android清单文件的清单标签下有WRITE_STORAGE_PERMISSION.我能够在SD卡上创建其他文件夹和文件而不会出现问题.该应用程序适用于以下手机:

  1. Nexus S(扎根)运行姜饼(2.3)
  2. 运行Jelly Bean的Nexus S(无根)(4.1​​.2)
  3. HTC Desire(rooted)运行Froyo(2.2)
  4. HTC Desire(无根)运行Froyo(2.2)

然而,在运行Ice Cream Sandwich(4.0.4)的三星Galaxy Nexus手机(无根)上,该目录被创建为零大小的文件,可以在Astro中看到.exists()调用返回false.

Astro显示零字节felix-cache文件

  1. 从文件夹名称可以看出,我正在使用Apache Felix.如果不存在,Felix会自动创建缓存目录.在Galaxy Nexus上,它总是抱怨它无法创建缓存目录.Astro显示0字节文件而不是文件夹.这就是我决定在初始化Felix之前尝试自己创建缓存文件夹的原因.
  2. 所以,我自己创建了缓存文件夹.该应用程序第一次正常工作,我可以在Astro中看到该文件夹​​正常.如果我关闭应用程序,然后删除Astro中的文件夹,然后重新启动应用程序,甚至我的代码神秘地无法创建缓存目录,Astro显示0字节文件.
  3. 无法在Astro中删除0字节文件.但是,当我重新启动手机时,该文件夹神奇地存在并且正常.
  4. 我使用FileInstall来观看OSGiComponents/install文件夹.当我将捆绑罐放入该文件夹时,它会在除Galaxy Nexus之外的所有手机上检测并安装好(当应用程序第一次运行时).FileInstall没有关于无法查看目录的日志/错误.
  5. 我在2台Galaxy Nexus手机上测试了这个,同样的问题.

我怀疑这是一个权限问题,但我不确定它是什么,以及为什么创建一个0字节文件而exists()返回false.代码中没有其他地方我创建这个文件.

关于可能出现什么问题的任何建议?

谢谢 :)

更新:我想我已经确定了问题,请看我发布的答案.

android apache-felix mkdirs

7
推荐指数
1
解决办法
3533
查看次数

如何检查两个Android绑定代理对象是否相等?

我对Android的活页夹有疑问.如果我理解正确,可以在进程之间传递Binder.在服务端,有一个Binder对象(原始对象).在客户端(在单独的过程中),有一个处理AIDL数据编组的BinderProxy对象.

我的问题是 - 如何检查两个BinderProxy对象是否相等?我的意思是,它们在服务过程中引用相同的Binder对象.我们可以使用equals()方法吗?BinderProxy对象与原始Binder对象具有相同的内存地址吗?

谢谢!

编辑:

回应David Wasser的评论:

我需要这样做的原因很难解释,但让我看看我是否可以清楚地解释它 -

远程服务提供AIDL API(客户端通过在onServiceConnected中接收IBinder获得).除其他外,AIDL API包含两种方法 -

IBinder getInterface(String interfaceName);

void releaseInterface(IBinder binder);

这个想法是客户端应用程序可以为不同接口的绑定器请求远程服务.接口实现的dex代码及其绑定器动态加载到服务中,并且事先不知道.该服务为客户端应用程序提供这两种AIDL方法,以根据接口名称访问这些动态加载的接口绑定器.

所以说有App1和App2.每个都做'binder1 = getInterface("SomeInterface1");' 并获取动态加载的接口'SomeInterface1'的绑定器.使用它之后,应用程序通过说'releaseInterface(binder1);'来释放界面活页夹.这样服务就可以卸载接口的dex代码并进行一些清理.

然而,接口DEX代码不能被卸载,除非这两个应用1和应用2已经发布了接口粘合剂.因此,在服务中,我为每个动态加载的绑定器维护引用计数.(说一个Map键{Binder} ==> value {reference count}).当App执行getInterface()时,我会增加引用计数.当它确实是releaseInterface(binder1)时,我应该减少引用计数.但是,为此,我需要检查binder1是否等于Map中的binder键.

请注意,绑定程序已从服务(原始绑定程序对象)传递到客户端应用程序(由getInterface()返回的绑定程序代理)并再次返回到服务(作为releaseInterface()的参数 - 它是否仍然是代理,或者原本的??).

App1和App2可以为相同的接口名称获取不同的绑定器对象(接口的不同实现).这就是为什么我用粘合剂释放的原因.

希望这不是太混乱!谢谢您的帮助.

卡尔蒂克

android android-binder

6
推荐指数
1
解决办法
2239
查看次数

标签 统计

android ×2

android-binder ×1

apache-felix ×1

mkdirs ×1