我是android新手,有时找不到合适的解决方案,这就是其中之一。
我写了一个简单的应用程序来编写使用ITextPdf libray生成的内部pdf。这工作得很好,我可以从设备文件资源管理器中看到pdf文件。现在我正在使用外部存储做同样的事情,但在这种情况下,我不能在下载文件夹中生成文件。我找到了对我的代码不起作用的解决方案。
我的代码:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-sdk android:minSdkVersion="21"
android:targetSdkVersion="31"
android:maxSdkVersion="31" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.PDFApplication">
<activity
android:name=".PdfDocumentTestActivity"
android:exported="true" />
<activity
android:name=".MainActivity"
android:exported="true" />
<activity
android:name=".SavePathActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".PrintPdfIPActivity2"
android:exported="true" />
</application>
java文件
public class SavePathActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_save_path);
Button btnShowPath = findViewById(R.id.btnPath);
btnShowPath.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
writeFile();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
});
}
private boolean isExternalStorageWritable(){
String res = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
Log.i("State","it's writable");
return true;
}else{
return false;
}
}
public void writeFile() throws FileNotFoundException {
if (isExternalStorageWritable() && checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//if (isExternalStorageWritable()) {
String directory_path = Environment.getExternalStorageDirectory() + "/MyDir/";
String targetPdf = directory_path + "ITEXTPDF.pdf";
Rectangle layout = new Rectangle(PageSize.ARCH_A);
//layout.setBackgroundColor(new BaseColor(100, 200, 180)); //Background color
layout.setBorderColor(BaseColor.DARK_GRAY); //Border color
layout.setBorderWidth(6); //Border width
layout.setBorder(Rectangle.BOX);
Document document = new Document(layout);
PdfWriter writer = null;
File dir = new File(directory_path);
if(!dir.exists())
dir.mkdirs();
File file = new File(dir, "newFile.pdf");
FileOutputStream fOut = new FileOutputStream(file);
try {
try {
writer = PdfWriter.getInstance(document, fOut);
} catch (DocumentException e) {
e.printStackTrace();
}
document.open();
PdfContentByte cb = writer.getDirectContent();
//Get width and height of whole page
float pdfPageWidth = document.getPageSize().getWidth();
float pdfPageHeight = document.getPageSize().getHeight();
document.add(new Paragraph("pdfPageWidth = "+pdfPageWidth));
document.add(new Paragraph("pdfPageHeight = "+pdfPageHeight));
Barcode39 barcode39 = new Barcode39();
barcode39.setCode("123456789");
Image code39Image = barcode39.createImageWithBarcode(cb, null, null);
document.add(code39Image);
document.newPage();
document.close();
//viewPdf("newFile.pdf", "MyDir");
} catch (DocumentException e) {
e.printStackTrace();
}
} else {
Toast.makeText(getApplicationContext(), "Cannot write External Storage", Toast.LENGTH_SHORT).show();
}
}
public boolean checkPermission(String permission){
int check = ContextCompat.checkSelfPermission(getApplicationContext(), permission);
int pm = PackageManager.PERMISSION_GRANTED;
return (check == PackageManager.PERMISSION_GRANTED);
}
}
我在ContextCompat.checkSelfPermission(getApplicationContext(),permission)
中发现了问题。它返回-1,但我不明白它不起作用。
在Android Q(Api级别29)中,您无法再获得此权限:
https://developer.android.com/reference/android/Manifest.permission#WRITE_EXTERNAL_STORAGE
您需要使用DocumentsFile API或其他方法在那里编写文件。不要尝试使用requestLegacyExternalStorage,因为Android 11已经不支持它了。
问题内容: 我的开发电话正在运行。 在我的应用程序中,我试图在外部存储上创建一个文件夹,该文件夹将存储我的应用程序的调试信息。基本上,它将包含应用程序执行的所有命令,因此,当用户遇到问题时,我可以选择使它们从debug文件夹发送信息给我进行分析。 我首先尝试将文件写入文件夹,但发现创建文件夹时出错。最初,我使用,然后又移至也不起作用。 我有我的清单。 这是用于创建文件夹的代码: 这是我也尝试过的:
问题内容: 我看到很多其他人都在问同样的问题,但是没有发布的解决方案对我有帮助。 我正在尝试从我的Android应用程序将(二进制)文件写入外部存储。我输入了清单,但仍然无法创建任何文件。我用来创建文件的代码是 对的调用失败,并引发(ENOENT,因为该目录不存在) 有人知道怎么回事吗?我什至尝试过重启设备。如果有任何区别,我使用的是Nexus 7的API级别8。 问题答案: 首先,您应该检查Ex
我的舱单中有权限条目: 编辑:我正在使用sdk 23
我想在Android应用程序中写入外部存储,但我似乎没有获得正确的权限。该应用程序在Android 7上运行,因此我请求如下运行时权限: 我的一个观察是,onRequest estPermissionsResult似乎返回未授予权限,但在启动应用程序时也从未提示我允许写入外部存储。 要写入存储的代码如下: 03-16 14:50:49.988 19145-19306/? 带系统。错误:java。i
我正在创建一个FileManager应用程序,我正在创建复制和剪切功能,它在内部设备存储中运行良好,但当我尝试在外部存储中复制某些内容时,它会说权限被拒绝。我拥有所有授予的写入权限。 如何在外部存储器中写入?