2016-01-13 77 views
0

在我的應用程序中,我使用了兩種構建風格/構建變體。切換到兩種構建版本後,我的應用程序中引入了一個錯誤。我現在發現了這個錯誤的原因,但我無法找到解決方案。具有多種構建風格的文件存儲

的情況:

在我的MainActivity類別,我有檢查文件是否存在的功能 - 這是非常簡單的;

public boolean fileExists(String filename) { 
    File file = null; 
    file = this.getApplicationContext().getFileStreamPath(filename); 
    return file.exists(); 
} 

使用調試器,文件的位置報告爲:/data/data/foo.bar.appname。 buildflavour/files/filename

在另一個類中,我嘗試寫入這個相同的位置;

outputStream = getActivity().getApplicationContext().openFileOutput(filename, Context.MODE_PRIVATE); 
outputStream.write("test"); 
outputStream.close(); 

然而,當我打印以下行中的OutputStream getActivity().getApplicationContext()的前 - 上下文被報告爲; [email protected]。因此,我相信這兩個類正試圖在不同位置保存/檢索文件。關於如何確保應用程序將文件寫入正確的構建風味位置的任何想法?先謝謝你!

+0

'com.foo.bar.appname @ 14fcdd18'看起來不像文件系統路徑。你甚至會如何獲得'OutputStream'的位置? – toKrause

+0

@toKrause更正,更新以提高清晰度。 – WalterB

+0

@WalterB請再次澄清您目前的問題 – gio

回答

1

您需要使用不同的應用程序ID。

形式的官方網站Configuring Gradle Builds

當使用建變種,構建系統使您能夠唯一標識不同的軟件包每個產品的口味和建設類型。

productFlavors { 
    pro { 
     applicationId = "com.example.my.pkg.pro" 
    } 
    free { 
     applicationId = "com.example.my.pkg.free" 
    } 
} 
+0

是的,我相信這是關鍵,但我不確定如何實現。我的第二個類中的'getActivity()。getApplicationContext()'應該用硬編碼的字符串替換嗎?儘管如此,這看起來並不是最好的編碼思想。 – WalterB

+0

你可以將它添加到你的'build.gradle'中,並且你將有2個不同的軟件包用於你的應用程序,當然可以使用你自己的名字 – gio

+0

謝謝你的幫助 - 但我已經有了這兩個不同的軟件包。但是,我有我的原始文章中提到的兩個類的代碼在'共享'文件夾中。出於某種原因,MainActivity能夠正確檢索productFlavor,而我的其他類不是。 – WalterB

0

最終我能找到答案,我的問題。最初我在MainActivity onCreate中調用了一個函數,但是這個函數不再被調用,因爲buildFlavors直接重定向到了我的一個應用程序片段。

對於任何人來到這裏都有類似的問題:驗證你的Flavors調用必要的函數和類。