我的应用程序有一个自动更新功能,下载APK,下载完成后,Intent.VIEW_ACTION打开应用程序,让用户安装下载的apk
Uri uri = Uri.parse("file://" + destination);
Intent install = new Intent(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
install.setDataAndType(uri,
manager.getMimeTypeForDownloadedFile(downloadId));
activity.startActivity(install);
Run Code Online (Sandbox Code Playgroud)
这适用于所有设备<24
现在使用Android 24显然我们不再允许使用file:///启动意图并且在一些谷歌搜索之后建议使用A文件提供程序
新代码:
Intent install = new Intent(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
install.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri apkUri = FileProvider.getUriForFile(AutoUpdate.this,
BuildConfig.APPLICATION_ID + ".provider", file);
install.setDataAndType(apkUri,
manager.getMimeTypeForDownloadedFile(downloadId));
activity.startActivity(install);
Run Code Online (Sandbox Code Playgroud)
现在activity.startActivity(安装); 抛出错误
找不到处理Intent的活动{act = android.intent.action.VIEW dat = content://com.xxxx.xx.provider/MyFolder/Download/MyApkFile.apk typ = application/vnd.android.package-archive flg = 0x4000000}
有什么方法可以在Android 7(24)中打开APK查看器吗?
android android-intent android-fileprovider viewaction android-7.0-nougat
我正在玩Spring和JPA/Hibernate,我对在表中递增计数器的正确方法感到困惑.
我的REST API需要根据用户操作递增和递减数据库中的某些值(在下面的示例中,喜欢或不喜欢标记会使计数器在Tag表中递增或递减1)
tagRepository是一个JpaRepository(Spring-data),我已经像这样配置了事务
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"/>
@Controller
public class TestController {
@Autowired
TagService tagService
public void increaseTag() {
tagService.increaseTagcount();
}
public void decreaseTag() {
tagService.decreaseTagcount();
}
}
@Transactional
@Service
public class TagServiceImpl implements TagService {
public void decreaseTagcount() {
Tag tag = tagRepository.findOne(tagId);
decrement(tag)
}
public void increaseTagcount() {
Tag tag = tagRepository.findOne(tagId);
increment(tag)
}
private void increment(Tag tag) {
tag.setCount(tag.getCount() + 1);
Thread.sleep(20000);
tagRepository.save(tag);
}
private void decrement(Tag tag) {
tag.setCount(tag.getCount() - 1);
tagRepository.save(tag);
} …Run Code Online (Sandbox Code Playgroud) 我想知道python是否有一些内置库(或网上的任何库..)那将为我创建一个依赖图?我有一个这样格式的文件
A::Requires = ""
B::Requires = A
C::Requires = B
H::Requires = A
AA::Requires = ""
BB::Requires = AA
C::Requires = B
CC::Requires = BB
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望有像这样的树:
A
+-B
+-C
+-H
AA
+-BB
+-CC
Run Code Online (Sandbox Code Playgroud)
所以基本上是一个lib,我将提供一个元组(A,B)或(A,H),它将为我构建树?如果这样的lib不存在,那么实现类似的东西会更简单吗?
谢谢
我试图限制用户可以使用我的REST API创建的帐户数量.
我本来希望使用Guava RateLimiter只允许IP在10分钟内创建5个帐户,但该RateLimiter.create方法只需要double指定"每秒"许可数.
有没有办法配置RateLimiter以大于一秒的粒度释放许可?
我的应用程序具有自动更新功能,可下载APK,然后使用Intent.ACTION_VIEW打开软件包安装程序.
最多7个它完美地工作(通过向正常文件提供Intent://)
使用Android 7,我不得不改为使用FileProvider.代码的唯一区别是:
Intent installIntent = new Intent(Intent.ACTION_VIEW);
if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
installIntent.setDataAndType(uri,
manager.getMimeTypeForDownloadedFile(downloadId));
} else {
Uri apkUri = FileProvider.getUriForFile(AutoUpdate.this,
BuildConfig.APPLICATION_ID, file);
installIntent.setDataAndType(apkUri,manager.getMimeTypeForDownloadedFile(downloadId));
}
activity.startActivity(installIntent);
Run Code Online (Sandbox Code Playgroud)
一旦调用了startActivity,我每次都会得到这个
这是Android 7的错误吗?或者某些/许可缺少我的一面?
编辑AndroidManifest
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_LOGS" />
<application ...>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.myapp"
android:exported="false"
android:enabled="true"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
Run Code Online (Sandbox Code Playgroud)
路径xmlfile
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="myfolder" path="."/> …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有自定义自动下载和安装APK它的工作原理如下
// auto register for the complete download
activity.registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
// Download the file through DownloadManager
String destination = Environment.getExternalStorageDirectory() + "/";
String fileName = "myfile.apk";
destination += fileName;
final Uri uri = Uri.parse("file://" + destination);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apkUrl));
request.setDescription("description");
request.setTitle("title");
request.setDestinationUri(uri);
final DownloadManager manager = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE);
final long downloadId = manager.enqueue(request);
onComplete = new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) {
Intent install = new Intent(Intent.ACTION_VIEW);
// BEFORE working doing this
//install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//install.setDataAndType(uri, …Run Code Online (Sandbox Code Playgroud) 我正在使用Networkx来管理依赖关系图.假设我有这个图表,每个字母代表一个服务器
>>> G = nx.Graph()
>>> G.add_edge("A","B")
>>> G.add_edge("A","H")
>>> G.add_edge("H","C")
>>> G.add_edge("B","C")
>>> G.add_edge("B","D")
A
/ \
H B
/ / \
C C D
Run Code Online (Sandbox Code Playgroud)
所以在这里我们可以看到,在启动A之前我们需要启动H和B并启动H我们需要启动C然后启动B我们需要启动C和D
通过在Networkx上摆弄一点我发现我可以通过执行dfs遍历来实现这一点
print nx.dfs_successors(G,"A")
{A:[H,B], H:[C], B:[D] }
Run Code Online (Sandbox Code Playgroud)
但是这个方法有问题.正如您所看到的,当树中有两个相同的字母时,Networkx只选择将其中一个放在最终结构中(这是正确的)但我需要有完整的结构如何强制Networkx添加到结构B中:[D,C] ??
我希望通过这样做来准确
>>> nx.dfs_successors(G,"B")
{'B': ['C', 'D']}
Run Code Online (Sandbox Code Playgroud)
所以一切都是"内部"正确的,只是dfs_successors不按照我希望的方式显示它.
谢谢
我有一个后端服务器(Java/Spring/Spring Security).目前,当移动应用程序用户登录时,他们只需提交用户名/密码,Spring Security就会创建一个会话,并使用JSESSIONID将其分配给请求.
我们现在还在移动应用程序"使用Facebook登录"上有一个按钮.以下是我对其如何运作的理解.
然后我的服务器检查access_token是否有效
GET graph.facebook.com/debug_token?
input_token={token-to-inspect}
&access_token={app-token-or-admin-token}
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(username, null, ROLE_USER));
Run Code Online (Sandbox Code Playgroud)
如果我找不到UID,我只需创建一个新用户并登录该用户.
从现在起,移动设备向服务器发出的每个请求都将具有SESSION(由spring security创建并附加),并且移动应用程序已通过身份验证
有人能告诉我这是否是一种好的做事方式?我应该停止使用会话并切换到Spring-Security-OAUTH2吗?
编辑1
根据Dave建议,这里是更新的spring-security配置:
<!- handle login by providing a token-->
<security:http pattern="/login/facebook" auto-config="false" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint">
<security:custom-filter ref="facebookLoginFilter" position="FORM_LOGIN_FILTER"/>
<security:intercept-url pattern="/**" access="isAuthenticated()" />
</security:http>
<bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<constructor-arg value="/login/facebook"></constructor-arg>
</bean>
<!-- handle basic username + password logins-->
<security:http auto-config="true" use-expressions="true" entry-point-ref="forbiddenEntryPoint">
<security:form-login login-processing-url="/security_check" authentication-failure-handler-ref="authFailureHandler"
default-target-url="/" always-use-default-target="true" authentication-success-handler-ref="authSuccessHandler" />
...
my others patterns.. …Run Code Online (Sandbox Code Playgroud) 对于我的REST api,我使用jersey和ExceptionMapper来捕获全局异常.它适用于我的应用程序抛出的所有异常,但我无法捕获杰克逊抛出的异常.
例如,我的一个端点接受包含枚举的对象.如果请求中的Json有一个不在enum jersey中的值,则返回此异常
Can not construct instance of my.package.MyEnum from String value 'HELLO': value not one of declared Enum instance names: [TEST, TEST2]
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@5922e236; line: 3, column: 1] (through reference chain: java.util.HashSet[0]->....)
Run Code Online (Sandbox Code Playgroud)
即使我已经创建了这个映射器
@Provider
@Component
public class JacksonExceptionMapper implements ExceptionMapper<JsonMappingException> {
@Override
public Response toResponse(JsonMappingException e) {
....
}
}
Run Code Online (Sandbox Code Playgroud)
代码永远不会到达此映射器.
为了捕捉这些例外,我们还需要做些什么吗?
编辑 注意:我有jus尝试不太通用而不是JsonMappingException我使用InvalidFormatException在这种情况下调用映射器.但我仍然不明白,因为InvalidFormatException扩展了JsonMappingException,也应该被调用
我正在尝试从 Spark 读取 s3 存储桶直到今天 Spark 总是抱怨请求返回 403
hadoopConf = spark_context._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.access.key", "ACCESSKEY")
hadoopConf.set("fs.s3a.secret.key", "SECRETKEY")
hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
logs = spark_context.textFile("s3a://mybucket/logs/*)
Run Code Online (Sandbox Code Playgroud)
Spark 说......无效的访问密钥 [ACCESSKEY]
但是,使用相同的 ACCESSKEY 和 SECRETKEY 这与 aws-cli 一起使用
aws s3 ls mybucket/logs/
Run Code Online (Sandbox Code Playgroud)
在 python boto3 中这是有效的
resource = boto3.resource("s3", region_name="us-east-1")
resource.Object("mybucket", "logs/text.py") \
.put(Body=open("text.py", "rb"),ContentType="text/x-py")
Run Code Online (Sandbox Code Playgroud)
所以我的凭据无效,问题肯定出在 Spark 上。
今天我决定打开整个 Spark 的“调试”日志,令我惊讶的是...... Spark 没有使用我提供的 [SECRETKEY] 而是......添加一个随机的???
17/03/08 10:40:04 DEBUG 请求:发送请求:HEAD https://mybucket.s3.amazonaws.com / Headers:(授权:AWS ACCESSKEY:[RANDON-SECRET-KEY],用户代理:aws -sdk-java/1.7.4 Mac_OS_X/10.11.6 Java_HotSpot(TM)_64-Bit_Server_VM/25.65-b01/1.8.0_65,日期:2017 年 3 月 8 日星期三 10:40:04 GMT,内容类型:application/x -www-form-urlencoded; charset=utf-8, …
amazon-s3 access-keys amazon-web-services http-status-code-403 apache-spark
android ×2
java ×2
python ×2
access-keys ×1
amazon-s3 ×1
apache-spark ×1
apk ×1
crash ×1
dependencies ×1
exception ×1
facebook ×1
graph ×1
guava ×1
hibernate ×1
jackson ×1
jersey ×1
jpa ×1
json ×1
networkx ×1
rest ×1
spring ×1
token ×1
transactions ×1
viewaction ×1