小编stk*_*ent的帖子

可以在FileProvider中使用多个权限吗?

背景

我维护一个库,其核心功能包括以编程方式捕获的屏幕截图与外部电子邮件应用程序共享.

我用a FileProvider来完成这个,这意味着我的库的清单包含一个<provider>标签:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.bugshaker.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />
</provider>
Run Code Online (Sandbox Code Playgroud)

filepaths.xml 定义如下:

<paths>
    <files-path path="bug-reports/" name="bug-reports" />
</paths>
Run Code Online (Sandbox Code Playgroud)

我的库的消费者有一个应用程序,它本身使用a FileProvider来共享文件.我的期望是,如果使用应用程序使用以下清单<provider>标记,则应该可以允许两个提供程序共享文件:

<provider
    android:authorities="${applicationId}.fileprovider;${applicationId}.bugshaker.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true"
    android:name="android.support.v4.content.FileProvider"
    tools:replace="android:authorities">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths"
        tools:replace="android:resource" />
</provider>
Run Code Online (Sandbox Code Playgroud)

这个清单条目:

  • 指定两个Provider权限${applicationId}.fileprovider(用于应用程序文件共享)和${applicationId}.bugshaker.fileprovider(用于库文件共享);
  • 引用更新filepaths.xml,其中包含应用程序生成的文件和库生成的文件的单独目录定义:
<paths>
    <external-path
        name="redacted"
        path="" />
    <files-path
        name="bug-reports"
        path="bug-reports/" />
</paths>
Run Code Online (Sandbox Code Playgroud)

构建应用程序后,我们已确认生成的清单已使用这些更新的值替换了正确的节点.

但是,当使用此配置的应用程序组装(成功)并运行时,我们会看到启动时崩溃:

E: FATAL EXCEPTION: main
   Process: com.stkent.bugshakertest, PID: 11636
   java.lang.RuntimeException: Unable to …
Run Code Online (Sandbox Code Playgroud)

android android-manifest android-contentprovider manifest-merging

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

Android Paint描边宽度定位

鉴于此代码绘制一条线:

Paint p;

p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setColor(android.graphics.Color.WHITE);
p.setStyle(Paint.Style.FILL);
p.setStrokeWidth(21);

canvas.drawLine(0,50,100,50,p);
Run Code Online (Sandbox Code Playgroud)

有3种可能的描笔策略:

  • 内部:线条画在矩形(0,50,100,70)
  • 中心:该线条绘制在矩形(0,40,100,60)
  • 外面:线条画在矩形(0,30,100,50)

在实践中,似乎默认行为遵循中心策略.是否可以修改油漆以产生与其他策略相对应的结果?

android drawing paint stroke

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

Google Maps V2无法使用正确的密钥在生产环境中工作

我在使用Android应用程序生产谷歌地图时遇到了重大麻烦.这就是我目前得到的(底部只是广告).

应用生产屏幕

我遵循的关键步骤:

1)我已经确保我已经获得了正确的SHA1生产密钥,并且已经在Google Console API和应用程序中实现了它(谷歌提供的密钥).我已经注册了两个键 - 一个用于调试,一个用于生产

2)互联网,位置等正在运作

3)该应用程序在DEBUG模式下工作,但在通过USB签名并安装在设备上时不起作用.我已经三次检查了标志的SHA 1签名等.

4)MapsFragment来自Android Studio中提供的模板.

在生产模式下,log cat显示:

01-11 16:04:54.511  19346-19437/com.mike.mapstest E/Google Maps Android API? Authorization failure.  Please see https://developers.google.com/maps/documentation/android/start for how to correctly set up the map.
01-11 16:04:54.516  19346-19437/com.mike.mapstest E/Google Maps Android API? In the Google Developer Console (https://console.developers.google.com)
    Ensure that the "Google Maps Android API v2" is enabled.
    Ensure that the following Android Key exists:
    API Key: YOUR_KEY_HERE
    Android Application (<cert_fingerprint>;<package_name>): <SHA1 Removed for this> ;com.mike.mapstest
Run Code Online (Sandbox Code Playgroud)

这个错误显然表明我的身份证明有问题吗?我究竟做错了什么?

android google-maps

29
推荐指数
2
解决办法
3万
查看次数

如何在Android Studio中每次运行之前自动清除logcat输出?

我正在使用Android Studio 1.0.2,并且无法在每次运行/调试之前找到清除logcat输出的方法.

是否有任何Gradle任务(类似于adb logcat -c)我可以创建运行/调试配置以清除输出?或者是否有更简单的方法来清除logcat?

android android-logcat android-studio android-gradle-plugin

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

从源代码构建Android:不支持的reloc 43

当我编译Android 5.1.1时,我收到了许多这样的错误:

...
...
...
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
Run Code Online (Sandbox Code Playgroud)

并且make进程最终失败:

clang: error: linker command failed with exit code 1 (use -v to see invocation)
build/core/host_shared_library_internal.mk:44: recipe for target 'out/host/linux-x86/obj32/lib/libnativehelper.so' failed
make: *** [out/host/linux-x86/obj32/lib/libnativehelper.so] Error 1
Run Code Online (Sandbox Code Playgroud)

我尝试过使用和不使用clang以及使用不同版本的clang来构建源代码.但是在新的分支上,clang是一种要求,如果没有它,make就无法启动.

可能有什么问题?

android makefile android-source

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

C++:删除与免费和性能

  1. 考虑:

    char *p=NULL;
    free(p) // or
    delete p;
    
    Run Code Online (Sandbox Code Playgroud)

    如果我使用freedelete开启会发生什么p

  2. 如果程序需要很长时间才能执行,比如10分钟,有没有办法将其运行时间减少到5分钟?

c++ performance pointers

26
推荐指数
3
解决办法
7万
查看次数

java.lang.Comparable和equals

如果我java.lang.Comparable为一个类实现,我仍然必须覆盖该equals()方法吗?或者也将Comparable工作equals

如果答案是否定的,那么如果出现一些差异怎么办?假设我在equals()方法中将两个对象称为相等的方式不同于我将两个相同类的对象称为相等的compareTo()方式Comparable.

而且,如果我实施Comparable,我还必须覆盖equals()吗?

java equals comparable

25
推荐指数
3
解决办法
2万
查看次数

是否有内置的Java方法来装箱阵列?

我可以用一种标准方法代替这种自定义方法吗?

public static Byte[] box(byte[] byteArray) {
    Byte[] box = new Byte[byteArray.length];
    for (int i = 0; i < box.length; i++) {
        box[i] = byteArray[i];
    }
    return box;
}
Run Code Online (Sandbox Code Playgroud)

java boxing

24
推荐指数
2
解决办法
9629
查看次数

通知setAutoCancel(true)不起作用

我正在尝试显示当用户点击它时删除的通知.我正在使用NotificationCompat该类来构建我的通知,然后调用setAutoCancel(true)我的构建器.这是一段代码:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.ic_launcher)
        .setContentTitle("title")
        .setAutoCancel(true)
        .setContentText("content");
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, mBuilder.build());
Run Code Online (Sandbox Code Playgroud)

通知已正确添加,但当我点击它时没有任何反应!我究竟做错了什么?

notifications android click

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

java.lang.IllegalArgumentException:参数“目录”不是android中的目录

我重建了我的项目并收到此错误。我无法找到它的来源。完整的日志是:

Caused by: java.lang.IllegalArgumentException: Parameter 'directory' is not a directory
    at org.apache.commons.io.FileUtils.validateListFilesParameters(FileUtils.java:545)
    at org.apache.commons.io.FileUtils.listFiles(FileUtils.java:521)
    at android.databinding.tool.store.ResourceBundle.loadClassInfoFromFolder(ResourceBundle.java:157)
    at android.databinding.tool.store.LayoutInfoInput$deps$2.invoke(LayoutInfoInput.kt:63)
    at android.databinding.tool.store.LayoutInfoInput$deps$2.invoke(LayoutInfoInput.kt:30)
    at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:154)
    at android.databinding.tool.store.LayoutInfoInput.getDeps(LayoutInfoInput.kt)
    at android.databinding.tool.store.LayoutInfoInput$existingBindingClasses$2.invoke(LayoutInfoInput.kt:86)
    at android.databinding.tool.store.LayoutInfoInput$existingBindingClasses$2.invoke(LayoutInfoInput.kt:30)
    at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:154)
    at android.databinding.tool.store.LayoutInfoInput.getExistingBindingClasses(LayoutInfoInput.kt)
    at android.databinding.tool.BaseDataBinder.<init>(BaseDataBinder.kt:40)
    at com.android.build.gradle.internal.tasks.databinding.DataBindingGenBaseClassesTask$CodeGenerator.run(DataBindingGenBaseClassesTask.kt:203)
    at com.android.build.gradle.internal.tasks.databinding.DataBindingGenBaseClassesTask.writeBaseClasses(DataBindingGenBaseClassesTask.kt:100)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
    ... 33 more
Run Code Online (Sandbox Code Playgroud)

帮助将不胜感激!

java android

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