GVKun编程网logo

【Android】WebDav For Android(安卓webdav软件)

9

在这里,我们将给大家分享关于【Android】WebDavForAndroid的知识,让您更了解安卓webdav软件的本质,同时也会涉及到如何更有效地AndroidWebView从内部存储加载|And

在这里,我们将给大家分享关于【Android】WebDav For Android的知识,让您更了解安卓webdav软件的本质,同时也会涉及到如何更有效地Android WebView从内部存储加载| Android 11 | Android R、【Android 布局】在程序中设置 android:gravity 和 android:layo...、【Android】43,android开发游戏app、【Android】AES加密算法的Android实现的内容。

本文目录一览:

【Android】WebDav For Android(安卓webdav软件)

【Android】WebDav For Android(安卓webdav软件)

最近在写一个云备份功能,参考了一下市面上的软件,发现有一种采用WebDav协议的云备份成本比较低,故特地研究一下使用。

服务器提供商是使用国内的坚果云,还是非常良心的。

坚果云官网:https://www.jianguoyun.com

注册账号后,点击账户信息,安全选项中即可看到 第三方应用管理

这里需要三个东西,服务器地址、账户、密码(这个密码是你为应用单独开辟的,不是用户密码),具体参考:http://help.jianguoyun.com/?tag=webdav

拿到数据后,我们就可以开始进行安卓开发了。

1.依赖以及权限设置

 因为涉及到网络,所以需要在Manifests中设置联网权限:

 <uses-permission android:name="android.permission.INTERNET" /> 

同时注意安卓9.0以上的网络安全策略,需要单独配置一下:

在res新建一个 network_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">www.pgyer.com</domain>
        <domain includeSubdomains="true">app-global.pgyer.com</domain>
    </domain-config>
</network-security-config>

接着在Manifests的application中配置:

android:networkSecurityConfig="@xml/network__config"

webDav网上的教程不是特别多,一开始找到的是 lookfirst/sardine

该项目是使用的HttpClient且和安卓部分依赖有些冲突,所以不推荐直接使用

后来在github中找到一个移植到安卓的sardine,项目地址

经过测试可以直接使用。

implementation 'com.thegrizzlylabs.sardine-android:sardine-android:0.5'

2.基础使用方法

请注意:以下所有方法都必须在新线程中进行,且对UI的直接操作要放回主线程进行,可以考虑使用Handler

(1).初始化

 Sardine sardine= new OkHttpSardine();
 sardine.setCredentials(userName,password);

这里的userName,password即你的用户账号+分配的应用的所属密码

(2).获取目录下所有文件

List<DavResource> resources = null;
        try {
            resources = sardine.list("https://dav.jianguoyun.com/dav/");//如果是目录一定别忘记在后面加上一个斜杠
            for (DavResource res : resources)
            {
                listNames=listNames+res+"\n";
            }
        } catch (IOException e) {
            e.printstacktrace();
        }

(3).判断路径(或文件)是否存在

//判断文件是否存在
if (sardine.exists("https://dav.jianguoyun.com/dav/file1.jpg"))
    System.out.println("got here!");
//判断路径是否存在
if (sardine.exists("https://dav.jianguoyun.com/dav/file/"))
    System.out.println("got here!");

 

若目录不存在,可以自己创建:

sardine.createDirectory("https://dav.jianguoyun.com/dav/
目录名称/");

(4).下载文件

InputStream is = sardine.get("https://dav.jianguoyun.com/dav/"+"文件目录"+"afile.jpg");

(5).上传文件

byte[] data = FileUtils.readFiletoByteArray(new File("/file/on/disk"));
sardine.put("http://yourdavserver.com/adirectory/nameOfFile.jpg", data);

或者使用

InputStream fis = new FileInputStream(new File("/some/file/on/disk.txt"));
sardine.put("http://yourdavserver.com/adirectory/nameOfFile.jpg", fis);

节省内存空间

(6).删除文件

sardine.delete("http://yourdavserver.com/adirectory/nameOfFile.jpg");

 

 

Android WebView从内部存储加载| Android 11 | Android R

Android WebView从内部存储加载| Android 11 | Android R

找到答案,

在定位setAllowFileAccess时,必须从Build.VERSION_CODES.R显式地将其设置为true,否则将不允许您加载file:// URLs

所以解决方案是

webView.settings.allowFileAccess = true

在Java中,

webView.getSettings().setAllowFileAccess(true);

这在两种情况下都可以正常工作。

【Android 布局】在程序中设置 android:gravity 和 android:layo...

【Android 布局】在程序中设置 android:gravity 和 android:layo...

在进行 UI 布局的时候,可能经常会用到 android:gravity  和 android:layout_Gravity 这两个属性。

 

关于这两个属性的区别,网上已经有很多人进行了说明,这边再简单说一下。 (资料来自网络)

 

 

 

 

LinearLayout 有两个非常相似的属性:

android:gravity 与 android:layout_gravity。

 

他们的区别在于:

 

android:gravity 属性是对该 view 中内容的限定.比如一个 button 上面的 text. 你可以设置该 text 相对于 view 的靠左,靠右等位置.

android:layout_gravity 是用来设置该 view 相对与父 view 的位置.比如一个 button 在 linearlayout 里,你想把该 button 放在 linearlayout 里靠左、靠右等位置就可以通过该属性设置. 

 

即 android:gravity 用于设置 View 中内容相对于 View 组件的对齐方式,而 android:layout_gravity 用于设置 View 组件相对于 Container 的对齐方式。

 

原理跟 android:paddingLeft、android:layout_marginLeft 有点类似。如果在按钮上同时设置这两个属性。

android:paddingLeft="30px"  按钮上设置的内容离按钮左边边界 30 个像素
android:layout_marginLeft="30px"  整个按钮离左边设置的内容 30 个像素

 


下面回到正题, 我们可以通过设置 android:gravity="center" 来让 EditText 中的文字在 EditText 组件中居中显示;同时我们设置 EditText 的 android:layout_gravity="right" 来让 EditText 组件在 LinearLayout 中居右显示。看下效果:

 

 

 

正如我们所看到的,在 EditText 中,其中的文字已经居中显示了,而 EditText 组件自己也对齐到了 LinearLayout 的右侧。

 

附上布局文件:

 

[xhtml] view plain copy print ?
  1. <LinearLayout  
  2.    xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent">  
  6.     <EditText  
  7.         android:layout_width="wrap_content"  
  8.         android:gravity="center"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="one"  
  11.         android:layout_gravity="right"/>  
  12. </LinearLayout>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <EditText android:layout_width="wrap_content" android:gravity="center" android:layout_height="wrap_content" android:text="one" android:layout_gravity="right"/> </LinearLayout> 

 

 

 

那么上面是通过布局文件的方式来设置的。,相信大家都曾写过,那么如何通过 Java 代码来设置组件的位置呢?

 

依然考虑实现上述效果。

 

通过查看 SDK,发现有一个 setGravity 方法, 顾名思义, 这个应该就是用来设置 Button 组件中文字的对齐方式的方法了。

仔细找了一圈,没有发现 setLayoutgravity 方法, 有点失望。 不过想想也对, 如果这边有了这个方法, 将 Button 放在不支持 Layout_Gravity 属性的 Container 中如何是好! 

 

于是想到, 这个属性有可能在 Layout 中 , 于是仔细看了看 LinearLayout 的 LayoutParams, 果然有所发现, 里面有一个 gravity 属性,相信这个就是用来设置组件相对于容器本身的位置了,没错,应该就是他了。

 

实践后发现,如果如此, 附上代码,各位自己看下。

 

 

 

代码比较简单,但是发现它们还是花了我一点时间的。

 

[java] view plain copy print ?
  1. Button button  = new Button(this);  
  2. button.setText("One");  
  3. LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);  
  4. // 此处相当于布局文件中的 Android:layout_gravity 属性   
  5. lp.gravity = Gravity.RIGHT;  
  6. button.setLayoutParams(lp);  
  7. // 此处相当于布局文件中的 Android:gravity 属性   
  8. button.setGravity(Gravity.CENTER);  
  9.   
  10. LinearLayout linear = new LinearLayout(this);  
  11. // 注意,对于 LinearLayout 布局来说,设置横向还是纵向是必须的!否则就看不到效果了。   
  12. linear.setOrientation(LinearLayout.VERTICAL);  
  13. linear.addView(button);  
  14. setContentView(linear);  
Button button = new Button (this); button.setText ("One"); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); // 此处相当于布局文件中的 Android:layout_gravity 属性 lp.gravity = Gravity.RIGHT; button.setLayoutParams (lp); // 此处相当于布局文件中的 Android:gravity 属性 button.setGravity (Gravity.CENTER); LinearLayout linear = new LinearLayout (this); // 注意,对于 LinearLayout 布局来说,设置横向还是纵向是必须的!否则就看不到效果了。 linear.setOrientation (LinearLayout.VERTICAL); linear.addView (button); setContentView (linear); 

 

或者这样也可以:

 

[java] view plain copy print ?
  1. Button button  = new Button(this);  
  2. button.setText("One");  
  3. // 此处相当于布局文件中的 Android:gravity 属性   
  4. button.setGravity(Gravity.CENTER);  
  5.   
  6. LinearLayout linear = new LinearLayout(this);  
  7. // 注意,对于 LinearLayout 布局来说,设置横向还是纵向是必须的!否则就看不到效果了。   
  8. linear.setOrientation(LinearLayout.VERTICAL);  
  9.   
  10. LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);  
  11. // 此处相当于布局文件中的 Android:layout_gravity 属性   
  12. lp.gravity = Gravity.RIGHT;  
  13.   
  14. linear.addView(button, lp);  
  15. setContentView(linear);  
Button button = new Button (this); button.setText ("One"); // 此处相当于布局文件中的 Android:gravity 属性 button.setGravity (Gravity.CENTER); LinearLayout linear = new LinearLayout (this); // 注意,对于 LinearLayout 布局来说,设置横向还是纵向是必须的!否则就看不到效果了。 linear.setOrientation (LinearLayout.VERTICAL); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); // 此处相当于布局文件中的 Android:layout_gravity 属性 lp.gravity = Gravity.RIGHT; linear.addView (button, lp); setContentView (linear); 

 

好了,效果图就不上了,跟上面的一样。 就讲这么多。

【Android】43,android开发游戏app

【Android】43,android开发游戏app

android:layout_width=“match_parent”

android:layout_height=“250dp”

android:orientation=“vertical”>

<LinearLayout

android:layout_marginTop=“10dp”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:orientation=“vertical”>

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“wrap_content”>

<RelativeLayout

android:layout_weight=“2”

android:layout_width=“167dp”

android:layout_height=“192dp”>

<ImageView

android:layout_centerInParent=“true”

android:layout_width=“127dp”

android:layout_height=“162dp”

android:background="@drawable/dialog_photo" />

<LinearLayout

android:layout_marginLeft=“5dp”

android:layout_weight=“6”

android:orientation=“vertical”

android:layout_width=“match_parent”

android:layout_marginRight=“5dp”

android:layout_height=“192dp”>

<TextView

android:id="@+id/title"

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“新消息”

android:textStyle=“bold”

android:textAlignment=“center”

android:textSize=“22sp”/>

<TextView

android:id="@+id/contents"

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:scrollbars=“vertical”

android:text=“1.如果软件失效了,请等待修复。\n2.如果更新失败了,请手动更新。\n3.软件仅仅是整合搜索接口,不保存任何资源。”

android:textSize=“18sp”/>

<View

android:layout_marginTop=“5dp”

android:layout_width=“match_parent”

android:layout_height=“1dp”

android:background="#c0c0c0"/>

<RelativeLayout

android:id="@+id/btn_ok"

android:background="?android:attr/selectableItemBackground"

android:layout_width=“match_parent”

android:la


yout_height=“match_parent”>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“已查阅”

android:textAlignment=“center”

android:textSize=“20sp”

android:textStyle=“bold”

android:layout_centerInParent=“true”

android:textColor="@color/purple_500"/>

4.新建MyDialog.java文件。

package jsz.nopi.firstapp;

import android.app.Dialog;

import android.content.Context;

import android.view.Gravity;

import android.view.View;

import android.view.Window;

import android.view.WindowManager;

public class MyDialog extends Dialog {

//style引用style样式

public MyDialog(Context context, int width, int height, View layout, int style) {

super(context, style);

setContentView(layout);

Window window = getwindow();

WindowManager.LayoutParams params = window.getAttributes();

params.gravity = Gravity.CENTER;

window.setAttributes(params);

}

}

5.修改MainActivity.java。

Window window = getwindow();

WindowManager.LayoutParams params = window.getAttributes();

params.gravity = Gravity.CENTER;

window.setAttributes(params);

}

}

5.修改MainActivity.java。

【Android】AES加密算法的Android实现

【Android】AES加密算法的Android实现


1 import android.text.TextUtils; 2 import android.util.Base64; 3 import android.util.Log; 4 5 import javax.crypto.Cipher; 6 import javax.crypto.spec.IvParameterSpec; 7 import javax.crypto.spec.SecretKeySpec; 8 9 public class AESCBCUtils { 10 private static final String TAG = "AESCBCUtils"; 11 12 // CBC(Cipher Block Chaining, 加密快链)模式,PKCS5Padding补码方式 13 // AES是加密方式 CBC是工作模式 PKCS5Padding是填充模式 14 /** 15 * 加解密算法/工作模式/填充方式 16 */ 17 private static final String CBC_PKCS5_PADDING = "AES/CBC/PKCS5Padding"; 18 // AES 加密 19 private static final String AES = "AES"; 20 21 // 密钥偏移量 22 //private static final String mstrIvParameter = "1234567890123456"; 23 /* key必须为16位,可更改为自己的key */ 24 //String mstrTestKey = "1234567890123456"; 25 26 // 加密 27 /** 28 * AES 加密 29 * 30 * @param strKey 加密密钥 31 * @param strClearText 待加密内容 32 * @param mstrIvParameter 密钥偏移量 33 * @return 返回Base64转码后的加密数据 34 */ 35 public static String encrypt_AES(String strKey, String strClearText, String mstrIvParameter){ 36 37 try { 38 byte[] raw = strKey.getBytes(); 39 // 创建AES密钥 40 SecretKeySpec skeySpec = new SecretKeySpec(raw, AES); 41 // 创建密码器 42 Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING); 43 // 创建偏移量 44 IvParameterSpec iv = new IvParameterSpec(mstrIvParameter.getBytes()); 45 // 初始化加密器 46 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); 47 // 执行加密操作 48 byte[] cipherText = cipher.doFinal(strClearText.getBytes()); 49 //Log.d(TAG, "encrypt result(not BASE64): " + cipherText.toString()); 50 String strBase64Content = Base64.encodetoString(cipherText, Base64.DEFAULT); // encode it by BASE64 again 51 //Log.d(TAG, "encrypt result(BASE64): " + strBase64Content); 52 strBase64Content = strBase64Content.replaceAll(System.getProperty("line.separator"), ""); 53 54 return strBase64Content; 55 } catch (Exception e) { 56 e.printstacktrace(); 57 } 58 59 return null; 60 } 61 62 // 解密 63 /** 64 * AES 解密 65 * 66 * @param strKey 解密密钥 67 * @param strCipherText 待解密内容 68 * @param mstrIvParameter 偏移量 69 * @return 返回Base64转码后的加密数据 70 */ 71 public static String decrypt(String strKey, String strCipherText, String mstrIvParameter) throws Exception { 72 73 try { 74 byte[] raw = strKey.getBytes("ASCII"); 75 // 创建AES秘钥 76 SecretKeySpec skeySpec = new SecretKeySpec(raw, AES); 77 // 创建密码器 78 Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING); 79 // 创建偏移量 80 IvParameterSpec iv = new IvParameterSpec(mstrIvParameter.getBytes()); 81 // 初始化解密器 82 cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); 83 // 执行解密操作 84 byte[] cipherText = Base64.decode(strCipherText, Base64.DEFAULT); // decode by BASE64 first 85 //Log.d(TAG, "BASE64 decode result(): " + cipherText.toString()); 86 byte[] clearText = cipher.doFinal(cipherText); 87 String strClearText = new String(clearText); 88 //Log.d(TAG, "decrypt result: " + strClearText); 89 90 return strClearText; 91 } catch (Exception e) { 92 e.printstacktrace(); 93 } 94 95 return null; 96 } 97 }

 

今天关于【Android】WebDav For Android安卓webdav软件的讲解已经结束,谢谢您的阅读,如果想了解更多关于Android WebView从内部存储加载| Android 11 | Android R、【Android 布局】在程序中设置 android:gravity 和 android:layo...、【Android】43,android开发游戏app、【Android】AES加密算法的Android实现的相关知识,请在本站搜索。

本文标签: