小编Art*_*wri的帖子

未经许可不允许启动服务Intent - 发送者未获得权限

我正在阅读 Mark Murphy 的优秀 Commonsware 书籍 - 但需要消化的内容很多。我构建了“FakePlayer”应用程序(假装是一个 mp3 播放器)。它包含一项服务。作为学习经验,我尝试编写一个简单的应用程序(只有一个按钮),其单击处理程序执行以下操作:

Intent i = new Intent();
i.setAction("com.example.cwfakeplayer.MyPlayerService");
Context context = getApplicationContext();
context.startService(i);
Run Code Online (Sandbox Code Playgroud)

它工作正常 - 服务启动正常。我注意到 Eclipse 抱怨该服务没有权限,因此我通过添加 2 行 android:permissions 和 android:exported 更新了服务的清单:

    <service 
        android:name="MyPlayerService"
        android:permission="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION"
        android:exported="true"
       <intent-filter>
            <action android:name="com.example.fakeplayer.MyPlayerService"></action>
       </intent-filter>
      </service>
Run Code Online (Sandbox Code Playgroud)

我在 Eclipse 下使用“调试”将播放器应用程序重新加载到设备上(我使用的是 Galaxy S2)。这似乎有效;入门应用程序导致了权限异常,这是我所期望的。

然后,我将其添加到入门应用程序的清单中(以授予其权限):

<manifest
  ...
  <uses-sdk ....
  ....
  <uses-permission android:name="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION" />
Run Code Online (Sandbox Code Playgroud)

我将入门应用程序重新加载到设备上(在 Eclipse 下使用调试)。在启动应用程序中仍然出现权限错误。

我从设备中删除了这两个应用程序并重新安装(使用调试...),首先是服务应用程序,然后是启动程序。仍然出现烫发错误。

我正在阅读 Murphy 先生的高级 Android 书籍中的“如何使用远程服务”部分,因此我意识到这可能不是跨应用程序工作的最佳方式。

我做了一个“adb shell dumpsys package”,找到了启动应用程序,发现它有“permissionsFixed=false”并且没有“grantedPermissions”部分。我认为这意味着入门应用程序中的清单更改未能成功将烫发添加到应用程序中。但我不知道为什么。作为一种学习经历,到目前为止它只产生了混乱......

任何线索都非常感谢!谢谢!

android commonsware android-permissions

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

是否正确使用Parcelable在应用程序之间发送数据?

我试图了解如何在Android中的应用程序之间进行通信 - 而不仅仅是在Activity实例之间.

我建立了一个"客户端",它将一个Messenger obj发送给一个服务(在Intent发送到服务中); 该服务创建一个Messageobj并使用它将其发送回'client' messenger.send(message).这工作正常,直到我尝试使用Message.obj来保存对象.

我在服务中创建了自己的ParcelableMyParcelable并将其放入消息中.一切都有效,直到消息在"客户端"中被解组.unmarshall失败,因为'客户'无法访问MyParcelable该类.这是显而易见的-他们是在不同的包(说com.whatever.myclientcom.whatever.myserver).这完全是错误的方法吗?

我也尝试过创建Parcel并发送(两个应用程序都可以访问该类) - 但事实Parcel并非如此Parcelable.我已经阅读过关于正在使用的类加载器,但是不了解单独的应用程序中的单独的类加载器(进程,如果我在这方面理解Android架构).也就是说,如何对一个类加载器"教授"另一个类加载器中存在的类?当然看起来应该有一个明显的"这就是你如何做到",但我还没有看到它.

android marshalling unmarshalling parcelable multiple-processes

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

如何在包含文件中部分声明typedef的结构

我试图最小化#include文件的相互依赖性作为一般做法.

在xxx.h我有:

struct my_struct;  // partial decl to satisfy use of my_struct*
void funct(struct my_struct* ms);  // uses the partial def
Run Code Online (Sandbox Code Playgroud)

如何使用typedef'd结构进行类似的部分decl?我在第三个#include中有一个实际的decl看起来像(例如在yyy.h中):

typedef struct my_data_s {
  int ival;
  ... struct's other components ...
} my_data_t;
Run Code Online (Sandbox Code Playgroud)

我只想在xxx.h中引用一个代表decl来引用typedef:

typedef struct my_data_s  my_data_t;  // actual full decl is elsewhere
void funct2(my_data_t* md);   
Run Code Online (Sandbox Code Playgroud)

此尝试导致"重新定义typedef my_data_t"错误.(使用gcc 4.4.3/Ubuntu 10.4)其他随机搜索尝试(例如,向typedef添加'{}')也会出错.

我知道编译器只需要知道函数需要一个指针,所以看起来这应该是可能的.到目前为止,没有发现任何编译错误/警告.

我看了其他问题和答案,找不到解决这个问题.似乎应该有一个众所周知的方法来做到这一点(?!)(我知道我可以#include yyy.y每当我#include xxx.h - 试图避免这种依赖.)谢谢.

c typedef include

5
推荐指数
1
解决办法
1741
查看次数

填充字节何时复制-结构分配,按值传递,其他?

在调试问题时,出现以下问题。(请忽略较小的代码错误;该代码仅供参考。)

定义了以下结构:

typedef struct box_t {
  uint32_t x;
  uint16_t y;
} box_t;
Run Code Online (Sandbox Code Playgroud)

这个结构的实例通过值在函数之间传递(显然是简化的):

void fun_a(box_t b)
{
    ... use b ...
}

void fun_b(box_t bb)
{
    // pass bb by value
    int err = funa(bb);
}

void fun_c(void)
{
    box_t real_b;
    box_t some_b[10];
    ...
    ... use real_b and some_b[]  ...
    ...
    funb(real_b);
    funb(some_b[3]);
    ...
    box_t copy_b = some_b[5];
    ...
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,像这样比较box_t的两个实例:

 memcmp(bm, bn, sizeof(box_t));
Run Code Online (Sandbox Code Playgroud)

在几个嵌套的调用中,使用类似以下的方法来转储box_t arg的字节:

char *p = (char*) &a_box_t_arg;
for (i=0; i < sizeof(box_t); i++) {
    printf(" %02X", …
Run Code Online (Sandbox Code Playgroud)

c struct padding memory-alignment

4
推荐指数
1
解决办法
3768
查看次数

从[[class alloc] init]返回nil被认为是好习惯吗?

它是Objective-C中常见的习语.

我只看到[[NSImage alloc] initWithContentsOfFile:str]上使用它,它总是让我觉得有内存泄漏,因为我调用了alloc而且口头禅是:"调用alloc,你必须调用release" - 除非它其中一个你不需要的案例.

cocoa idioms

2
推荐指数
1
解决办法
861
查看次数

在objective-c中,当使用#define和#if时,使用YES/NO的替代方法是什么

由于定义了YES/NO的方式,您不能使用YES/NO #if,例如,#define CAN_DO YES这表示由标签CAN_DO控制的代码应该通常使用"打开" #if CAN_DO.作为一个老学校的C家伙,我会用,#define CAN_DO 1但觉得它不是'Objective-C like'.有没有首选的'目标-C'方式来做到这一点?(顺便说一句,我知道#ifdef但是那些使用标签的人最好通过提供#defined'd符号)来服务.

更简单地说,我希望那些将在"用户"代码中设置符号的人能够说出类似的内容#define SOME_SYMBOL YES.但是我认为C方式#define SOME_SYMBOL 1和它一样好.

objective-c conditional-compilation

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