小编Joh*_*y19的帖子

Android安装apk与Intent.VIEW_ACTION无法使用文件提供程序

我的应用程序有一个自动更新功能,下载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

61
推荐指数
3
解决办法
4万
查看次数

Spring,JPA和Hibernate - 如何在没有并发问题的情况下增加计数器

我正在玩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)

java spring hibernate jpa transactions

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

在python中构建依赖图

我想知道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不存在,那么实现类似的东西会更简单吗?

谢谢

python dependencies graph

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

番石榴的RateLimiter每分钟而不是秒?

我试图限制用户可以使用我的REST API创建的帐户数量.

我本来希望使用Guava RateLimiter只允许IP在10分钟内创建5个帐户,但该RateLimiter.create方法只需要double指定"每秒"许可数.

有没有办法配置RateLimiter以大于一秒的粒度释放许可?

java rate-limiting guava

11
推荐指数
2
解决办法
9035
查看次数

Android 7打开APK,ACTION_VIEW无效(包安装程序已停止)

我的应用程序具有自动更新功能,可下载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)

crash apk packageinstaller android-7.0-nougat

10
推荐指数
2
解决办法
3080
查看次数

使用FileProvider时没有找到处理Intent的Activity

在我的应用程序中,我有自定义自动下载和安装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)

android android-intent android-fileprovider

9
推荐指数
2
解决办法
5558
查看次数

使用Networkx(Python)进行图遍历

我正在使用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不按照我希望的方式显示它.

谢谢

python networkx

8
推荐指数
2
解决办法
7687
查看次数

接受facebook登录我的REST API

我有一个后端服务器(Java/Spring/Spring Security).目前,当移动应用程序用户登录时,他们只需提交用户名/密码,Spring Security就会创建一个会话,并使用JSESSIONID将其分配给请求.

我们现在还在移动应用程序"使用Facebook登录"上有一个按钮.以下是我对其如何运作的理解.

  1. 移动应用使用facebook SDK获取"access_token"
  2. 移动应用程序从facebook(名称,姓氏,电子邮件等)中检索USer个人资料
  3. 如果用户名是唯一的,则移动检查(针对MY服务器)
  4. 如果用户名是唯一的,请调用MY REST api,使用此类/ login/facebook POST over SSL并传递access_token,电子邮件,用户名等...)
  5. 然后我的服务器检查access_token是否有效

    GET graph.facebook.com/debug_token? input_token={token-to-inspect} &access_token={app-token-or-admin-token}

  6. 如果是,如果facebook返回的UID已存在于我的本地数据库中,我将用户签名如下:
SecurityContextHolder.getContext().setAuthentication(
                new UsernamePasswordAuthenticationToken(username, null, ROLE_USER));
Run Code Online (Sandbox Code Playgroud)
  1. 如果我找不到UID,我只需创建一个新用户并登录该用户.

  2. 从现在起,移动设备向服务器发出的每个请求都将具有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 facebook token spring-security spring-security-oauth2

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

泽西岛无法抓住任何杰克逊的例外

对于我的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,也应该被调用

json exception jersey jackson exceptionmapper

8
推荐指数
2
解决办法
2101
查看次数

Spark 正在发明他自己的 AWS secretKey

我正在尝试从 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

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