2016-09-15 39 views
1

你好,我正在嘗試創建一個有一個Button,兩個TextViews和一個ImageView的Activity。當按鈕被點擊時,活動應該發送一個用於捕獲照片並將照片保存在緩存中的意圖。Android:按鈕被點擊但方法沒有啓動

解決當前錯誤可以在編輯中找到:

的問題是,當我按下按鈕,沒有任何反應。加入一些日誌後,我發現,這個問題是在下面的方法:

private File createImageFile() throws IOException { 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = new File(this.getCacheDir(), "target"); 
    File image = File.createTempFile(
      imageFileName, 
      ".jpg", 
      storageDir 
    ); 

    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

它是由開發者文檔保存圖片的例子,但我改變了這裏的代碼:

File storageDir = new File(this.getCacheDir(), "export"); 

解決FileProvider錯誤。

有人知道我的代碼有什麼問題嗎?

編輯:對於上述錯誤的解決方案,請遵循Rahul的鏈接。 現在我得到FileProvider的另一個問題。

解決看阿吉特Pandians回答解決方案

Logcat: 

    09-15 10:44:31.551 14882-14882/org.artoolkit.ar.samples.NftSimple E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: org.artoolkit.ar.samples.NftSimple, PID: 14882 
    java.lang.IllegalArgumentException:Failed to find configured root that contains /data/data/org.artoolkit.ar.samples.NftSimple/cache/targets/JPEG_20160915_104431_363552678.jpg 
    at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:678) 
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:377) 
    at org.artoolkit.ar.samples.nftSimple.MenuActivity.dispatchTakePictureIntent(MenuActivity.java:72) 
    at org.artoolkit.ar.samples.nftSimple.MenuActivity.access$000(MenuActivity.java:27) 
    at org.artoolkit.ar.samples.nftSimple.MenuActivity$1.onClick(MenuActivity.java:46) 
    at android.view.View.performClick(View.java:4780) 
    at android.view.View$PerformClick.run(View.java:19866) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

和使用該文件提供的代碼:

private void dispatchTakePictureIntent() { 
    Log.i(TAG, "I try to use my Method"); 
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    if (cameraIntent.resolveActivity(getPackageManager()) != null) { 
     File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      Log.i(TAG, "Error while creating the Image: " + ex.getMessage()); 
      ex.printStackTrace(); 
     } 
     if(photoFile != null) { 
      Uri photoURI = FileProvider.getUriForFile(this, 
        "org.artoolkit.ar.samples.nftSimple.fileprovider", 
        photoFile); 
      cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
      startActivityForResult(cameraIntent, CAMERA_REQUEST); 
     } 
    } 
} 

file_paths.xml:

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
<cache-path name="my_images" path="Android/data/org.artoolkit.ar.samples.nftSimple/files/Pictures" /> 
</paths> 

提供商清單:

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="org.artoolkit.ar.samples.nftSimple.fileprovider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/file_paths"></meta-data> 
    </provider> 
+0

您可以請您發佈該方法被調用時得到的整個錯誤日誌嗎? – Aenadon

+0

@Aenadon完全忘了那個。感謝提及它! –

回答

1

我發現file_paths.xml文件的問題。

由文檔

<cache-path name="name" path="path" /> 
    "Represents files in the cache subdirectory of your app's internal storage area. 
    The root path of this subdirectory is the same as the value returned by getCacheDir()". 

意味着它會返回 「/data/org.artoolkit.ar.samples.nftSimple/cache/」。

你只需要給像「pictures /」這樣的子文件夾即可獲得 「Android/data/org.artoolkit.ar.samples.nftSimple/cache/pictures /」。

你file_paths.xml想這

<cache-path name="my_images" path="target/" /> 

我希望這會幫助你。

+0

謝謝,但那也是Rahul通過鏈接在他的答案中提到的 –

+0

看到我編輯的答案並讓我知道結果。 @ Vincentthe0ne –

+0

爲我工作,謝謝你 –

1

嘗試添加如下因素在AndroidManifest

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

也爲你的問題可能的解決辦法是這樣的:

Error: open failed: ENOENT (No such file or directory)

+0

謝謝你提到這個,但我已經在我的清單中得到了它。 –

+0

根據Android文檔,您不需要保存到緩存目錄的權限。 - >「應用程序不需要額外的權限來讀取或寫入返回的路徑[緩存路徑],因爲此路徑存在於其私有存儲中。」 – Aenadon

+0

您沒有正確使用Environment.DIRECTORY_PICTURES。它本身不是一個文件夾,您需要將它用作getExternalStoragePublicDirectory()方法的參數。 請點擊這裏:[鏈接](http://developer.android.com/reference/android/os/Environment.html#getExternalStoragePublicDirectory(java.lang.String)) –